VC6是Microsoft非常经典的开发环境,尤其是Windows API方式开发,自从Quick C for win以来基本保持着同样的风格和API,在它上面做习练很不错。下面是习练完成的界面,它是在自动创建的WIN32 application模板下,增加一个Dialog,然后将Dialog嵌入到默认页面中的,这样Dialog即为应用窗体,而Dialog则可以借助于Dialog Editor摆放控件,接近于RAD方式开发。

步骤一:创造WIN32应用程序。

创建后大致浏览一下WIN32开发套路,建应用程序结构、注册窗口、显示并update窗口,然后进入消息主循环。这种结构是基础,在Dev C、PowerBASIC, FreeBASIC的Win32开发也是一样的,与开发语言没关系,是WIN32SDK 开发结构上的要求。
步骤二:SDI界面创建后,马上创建自己的Dialog
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
-
- hInst = hInstance; // Store instance handle in our global variable
-
- hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
-
- if (!hWnd)
- {
- return FALSE;
- }
-
- hWndGlobal = hWnd;
-
- SetWindowText(hWnd, "Dialog as Application - VC6");
- nCmdShow = SW_SHOW;
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
-
-
- // Create DIALOG box
- HWND hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAINFORM), hWnd, (DLGPROC)Mainform);
- // Show DIALOG box
- ShowWindow(hDlg, SW_SHOWNA);
- UpdateWindow(hWnd);
-
- RECT rectDlgw, rectDlgc, rectMainw, rectMainc;
- GetWindowRect(hWnd, &rectMainw); //Dialog window area
- GetClientRect(hWnd, &rectMainc); //Dialog client area
- GetWindowRect(hDlg, &rectDlgw); //Dialog window area
- GetClientRect(hDlg, &rectDlgc); //Dialog client area
-
- RECT rect;
- HWND hwndDT=GetDesktopWindow();
- GetClientRect(hwndDT,&rect);
- LONG dtWidth=rect.right-rect.left;
- LONG dtHeight=rect.bottom-rect.top;
-
- RECT rectbar;
- HWND taskbar = FindWindow("Shell_TrayWnd", "");
- GetWindowRect(taskbar, &rectbar);
- //if(rectbar.top>0) //TASKBAR at bottom
- //if(rectbar.left>0) //TASKBAR at left
-
- //Center MAINWINDOW at desktop client area
- MoveWindow(hWnd, (rectbar.right-rectbar.left)+(dtWidth-(rectMainw.right-rectMainw.left))/2, (dtHeight-(rectMainw.bottom-rectMainw.top))/2, (rectDlgw.right-rectDlgw.left), (rectDlgw.bottom-rectDlgw.top) + (rectDlgc.bottom-rectDlgc.top)-(rectMainc.bottom-rectMainc.top)+1, 1);
-
- //Align inner DIALOG to MAINWINDOW
- MoveWindow(hDlg, 0, 0, rectDlgw.right, rectDlgw.bottom, 1);
-
- UpdateWindow(hWnd);
-
- return TRUE;
- }

上面这两句是重点,这两句下面的功能是计算后调整SDI窗体,让它刚好将Dialog装入进去,并将它们显示在屏幕中央位置。
(DLGPROC)Mainform 参数指的是回调函数,在CALLBACK函数Mainform中,对Dialog Editor摆放的控件进行操作。
步骤三:操作Dialog 控件
- LRESULT CALLBACK Mainform(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_INITDIALOG:
- {
- //Change DIALOG icon
- HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON3));
- SetClassLong(hDlg, GCL_HICONSM, (LONG)hIcon);
-
- GetDlgItem(hDlg, IDC_PROGRESS1);
- SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETRANGE, MAKEWPARAM(0, 0), MAKELPARAM(0, 59));
- //SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, 65), (LPARAM)(0, 0));
-
- SetTimer(hDlg, 1, 1000, NULL);
- //KillTimer(hDlg, 1);
- break;
-
- /*
- typedef struct _SYSTEMTIME {
- WORD wYear;
- WORD wMonth;
- WORD wDayOfWeek;
- WORD wDay;
- WORD wHour;
- WORD wMinute;
- WORD wSecond;
- WORD wMilliseconds;
- } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
- */
-
- SYSTEMTIME st, lt;
- GetSystemTime(&st);
- GetLocalTime(<);
- SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, st.wSecond), (LPARAM)(0, 0));
-
- break;
- case WM_TIMER:
- {
- SYSTEMTIME st, lt;
- GetSystemTime(&st);
- GetLocalTime(<);
- SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, st.wSecond), (LPARAM)(0, 0));
- }
- break;
- case WM_PAINT:
- break;
- case WM_CTLCOLORDLG:
- break;
-
- case WM_ERASEBKGND:
- case WM_NCPAINT:
- break;
- case WM_SYSCOMMAND:
- if (wParam == SC_CLOSE)
- {
- EndDialog (hDlg, TRUE);
- KillTimer(hDlg, 1);
- PostQuitMessage(0);
- return(TRUE);
- }
- break;
- case WM_COMMAND:
- //if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
- if (LOWORD(wParam) == IDOK)
- {
- EndDialog(hDlg, LOWORD(wParam));
- KillTimer(hDlg, 1);
- PostQuitMessage(0);
- return TRUE;
- }
- if (LOWORD(wParam) == IDCANCEL)
- {
- if (!IsDlgButtonChecked(hDlg, IDC_CHECK1)){CheckDlgButton(hDlg, IDC_CHECK1, BST_CHECKED);}
- if (!IsDlgButtonChecked(hDlg, IDC_RADIO1)){CheckDlgButton(hDlg, IDC_RADIO1, BST_CHECKED);}
-
- }
- if (LOWORD(wParam) == IDC_BUTTON4)
- {
- SendMessage(hDlg, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
- }
- if (LOWORD(wParam) == IDC_BUTTON3)
- {
- SendMessage(hDlg, WM_SYSCOMMAND, SC_MINIMIZE, 0);
- }
- if (LOWORD(wParam) == IDC_BUTTON2)
- {
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT1),"Message 1");
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT2),"Message 2");
- SetWindowText(GetDlgItem(hDlg, IDC_EDIT3),"Message 3");
- }
- break;
- }
- return FALSE;
- }
上面的代码包括对Edit文本框的操作,对Button的操作,对复选和Radio的操作,还用到了一个SYSTEMTIME结构和操作函数,让界面上的指示条随秒而动。对MFC的习练比WIN32功能多一些,编写程序比WIN32方便,但代码不如WIN32程序精练直接。
祝福CSDN朋友们节日快乐,学业进步、职场升级,身体健康!