win32創建控件和提示文本

基於SDK的win32程序框架一般總是由兩個基本函數組成:一個是入口函數WinMain,它包含了整個框架的運行代碼;另一個是用戶定義的窗口過程函數SDKWndProc(名稱可以在程序中自動定義),用來接收 和處理各種不同的消息。





#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK SDKWndProc (HWND, UINT, WPARAM, LPARAM);		// 窗口過程

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
{
     HWND       	hwnd ;			// 窗口句柄
     MSG        	msg ;			// 消息
     WNDCLASS		wndclass ;		// 窗口類
     wndclass.style  			= CS_HREDRAW | CS_VREDRAW ;	
     wndclass.lpfnWndProc   	= SDKWndProc ;					
     wndclass.cbClsExtra    	= 0 ;
     wndclass.cbWndExtra    	= 0 ;
     wndclass.hInstance     	= hInstance ;
     wndclass.hIcon         	= LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       	= LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground 	= (HBRUSH) GetStockObject ( WHITE_BRUSH ) ;
     wndclass.lpszMenuName  	= NULL ;
     wndclass.lpszClassName 	= "SDKWin";			// 窗口類名
     if (!RegisterClass (&wndclass))				// 註冊窗口
     {
          MessageBox (NULL, "窗口註冊失敗!", "HelloWin", 0) ;
          return 0 ;
     }

     // 創建窗口
     hwnd = CreateWindow ("SDKWin",                 	// 窗口類名
                          "實驗2 Windows編程基礎",		// 窗口標題
                          WS_OVERLAPPEDWINDOW,			// 窗口樣式
                          CW_USEDEFAULT,            	// 窗口最初的 x 位置
                          CW_USEDEFAULT,             	// 窗口最初的 y 位置
                          400,             	// 窗口最初的 x 大小
                          320,             	// 窗口最初的 y 大小
                          NULL,                       	// 父窗口句柄
                          NULL,                       	// 窗口菜單句柄
                          hInstance,                  	// 應用程序實例句柄
                          NULL) ;                     	// 創建窗口的參數
     ShowWindow (hwnd, nCmdShow) ;			// 顯示窗口				
     UpdateWindow (hwnd) ;					// 更新窗口,包括窗口的客戶區
     while (GetMessage (&msg, NULL, 0, 0))
     {
	  		TranslateMessage (&msg) ;		// 轉換某些鍵盤消息
       		DispatchMessage (&msg) ;		// 將消息發送給窗口過程,這裏是WndProc
     }
     return msg.wParam ;
}

LRESULT CALLBACK SDKWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static	HWND	hwndHint, hwndRes, hwndEdit, hwndBtn;
	HFONT			hFont;
 	switch (message)
	{
		case WM_CREATE:		hFont		= (HFONT)GetStockObject ( DEFAULT_GUI_FONT );
							hwndHint	= CreateWindow("STATIC", "輸入半徑: ",
								WS_CHILD | WS_VISIBLE | SS_SIMPLE, 
								20, 20, 100, 20, hwnd, NULL, NULL, NULL );
							hwndEdit	= CreateWindow("EDIT", NULL,
								WS_CHILD | WS_VISIBLE | WS_BORDER, 
								20, 40, 100, 20, hwnd, NULL, NULL, NULL );
							hwndBtn		= CreateWindow("BUTTON", "圓面積",
								WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
								140, 40, 80, 20, hwnd, NULL, NULL, NULL );
							hwndRes	= CreateWindow("STATIC", NULL,
								WS_CHILD | WS_VISIBLE | SS_SIMPLE, 
								20, 70, 180, 20, hwnd, NULL, NULL, NULL );

							SendMessage(hwndHint,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE); 
							SendMessage(hwndEdit,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE); 
							SendMessage(hwndBtn,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE); 
							SendMessage(hwndRes,	WM_SETFONT, (WPARAM)hFont,  (LPARAM)TRUE); 
							break;
	 case WM_COMMAND:	// 命令消息,控件產生的通知代碼在wParam的高字中
							if (((HWND)lParam == hwndBtn )&&( HIWORD(wParam) == BN_CLICKED ))
							{
								char	strEdit[80];
								// 獲取編輯框控件的內容,並將其轉換成float數值
								if ( GetWindowText( hwndEdit, strEdit, 80) > 0 ) 	// 獲取編輯框內容
								{
									float fRes = (float)atof( strEdit );
									if ( fRes > 0.0f )
									{
										sprintf( strEdit, "圓面積爲: %f", 3.14 * fRes * fRes ); 
										SetWindowText( hwndRes, strEdit );
									} else
										MessageBox( hwnd, "圓半徑輸入無效!", "注意", 0 );
								} else
									MessageBox( hwnd, "請輸入圓的半徑!", "注意", 0 );
							}
							break;


		case WM_DESTROY:	// 當窗口關閉時產生的消息
		  					PostQuitMessage (0) ;
			  				return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ; // 執行默認的消息處理
}

在CALLBACK SDKWndProc 中,這樣就創建了兩個靜態控件、一個編輯框和一個按鈕。需要說明的是:

  • 將hwndHint\hwndRes\hwndEdit和hwndButton窗口句柄定義成static的目的是使其成爲全局變量,當SDKWndPro第一次調用創建後,就會一直有效。用CreateWindow函數創建窗口時,若指定的是預定義的窗口名BUTTON、COMBOBOX、EDIT、LISTBOX、SCROLLBAR和STATIC,則創建的是按鈕、組合框、編輯框、列表框、滾動條和講臺空間等窗口。由於這些空間窗口必須是主窗口的子窗口,所以爲其指定的風格中一定要有WS_CHILD和WS_VISIBLE,同時指定父窗口句柄爲主窗口句柄hwnd。

  • 各空間的字體可通過SendMessage函數並指定WM_SETFONT消息來更改。DEFAULT_GUI_FONT是獲取系統消息對話框和菜單中的默認字體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章