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

VC6 WIN32,Dialog为主窗口编程-LMLPHP

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

VC6 WIN32,Dialog为主窗口编程-LMLPHP

创建后大致浏览一下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;
}

VC6 WIN32,Dialog为主窗口编程-LMLPHP

上面这两句是重点,这两句下面的功能是计算后调整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(&lt);
				SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, st.wSecond), (LPARAM)(0, 0)); 

			break;
		case WM_TIMER:
			{
				SYSTEMTIME st, lt;
				GetSystemTime(&st);
				GetLocalTime(&lt);
				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朋友们节日快乐,学业进步、职场升级,身体健康!

10-06 09:12