C語言API編寫窗體界面和按鈕

最近有個同學的程序需要用對話框的方式實現,但前面都是通過黑框形式完成的,老師突然讓增加一個界面,本來準備採用MFC完成的,但後來一想,該程序核心東西是體現在它的算法上,控制檯的程序並非不好.轉念一想,如果使用MFC這樣的方法好像需要再倒騰一遍,想到了大一在"C語言能幹大事"中的東西,所以就準備採用這種形式直接完成,投機取巧的方法.
主要是通過調用Windows API界面的CreateWindows函數完成,同時也能創建按鈕,把參數設置爲button,如果想響應該按鈕,只需在回調函數中增加消息WM_COMMAND判斷即可.代碼如下:
#include
#include

//聲明回調函數
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

//主函數 程序入口
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("HelloWin") ;
	HWND         hwnd ;        //用來保存成功創建窗口後返回的句柄
    MSG          msg ;         //定義消息結構體變量
    WNDCLASS     wndclass ;    //窗體類

    wndclass.style         = CS_HREDRAW | CS_VREDRAW ; //指定窗口風格
    wndclass.lpfnWndProc   = WndProc ; ////函數指針,指向處理窗口消息的函數入口
    wndclass.cbClsExtra    = 0 ;       //結構體後附加的字節數,一般總爲0
    wndclass.cbWndExtra    = 0 ;       //窗體實例附加的字節數,一般總爲0
    wndclass.hInstance     = hInstance ;                          //模塊句柄
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;   //圖標句柄 任務欄顯示的圖標
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;       //光標句柄
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景顏色COLOR_BACKGROUND
    wndclass.lpszMenuName  = NULL ;      //菜單名的字符串
    wndclass.lpszClassName = szAppName ; //自定義類名,不要與其他類名重複

	if (!RegisterClass (&wndclass))
    {
        MessageBox (NULL, TEXT ("註冊類失敗!"), szAppName, MB_ICONERROR) ;
        return 0 ;
    }

	int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中
	int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中

	//創建窗體API
	hwnd = CreateWindow(szAppName,TEXT("畢業設計"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);
	//顯示窗體的API 傳入需要顯示的窗體句柄和顯示方式
	ShowWindow(hwnd,iCmdShow);
	//刷新窗體的API
	UpdateWindow(hwnd);

	//從系統的應用程序線程消息隊列中取得一個消息
	while(GetMessage(&msg,NULL,0,0) > 0)
	{
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC			 hdc;             //句柄
     PAINTSTRUCT	 ps;
     RECT			 rect;            //矩形
	 HINSTANCE       hInstance;       //窗口實例
	 static HWND     hwndButton[2];   //按鈕句柄
     
     switch (message)
     {        
	 case WM_CREATE: //創建按鈕
		 {
			hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
			//按鈕1
			hwndButton[0] = CreateWindow("BUTTON","訓練",      
				WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  
				10,10,100,100,hwnd,NULL,
				(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
			//按鈕2
			hwndButton[1] = CreateWindow("BUTTON","獲取",      
				WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  
				10,250,100,100,hwnd,NULL,
				(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
			return 0;
		 }
	 case WM_PAINT: //繪製文字
		 hdc = BeginPaint(hwnd,&ps);
		 GetClientRect(hwnd,&rect);
		 DrawText(hdc,TEXT("By:Eastmount CSDN製作"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
		 EndPaint(hwnd,&ps);
		 return 0;
	 case WM_COMMAND: //響應按鈕消息
		 if((HWND)lParam == hwndButton[0])
		 {
			 MessageBox(NULL,TEXT("是否訓練圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);
		 }
		 if((HWND)lParam == hwndButton[1])
		 {
			MessageBox(NULL,TEXT("是否獲取圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);
		 }
		 return 0;
	 case WM_CLOSE: //關閉
		 if(IDYES==MessageBox(hwnd,"是否關閉程序?","提示",MB_YESNO|MB_ICONQUESTION))
		 {
			 DestroyWindow (hwnd);   
		 }
		 return 0;
	 case WM_DESTROY: //退出程序
		 PostQuitMessage (0) ;
		 return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}
程序運行結果如下圖所示:
\ \
其中主要涉及到的函數原型如下所示:
//創建窗體
hwnd = CreateWindow (
	szClassName,         /* Classname */
	"Windows App",       /* Title Text */
	WS_OVERLAPPEDWINDOW, /* default window */
	CW_USEDEFAULT,       /* Windows decides the position */
	CW_USEDEFAULT,       /* where the window ends up on the screen */
	544,                 /* The programs width */
	375,                 /* and height in pixels */
	HWND_DESKTOP,        /* The window is a child-window to desktop */
	NULL,                /* No menu */
	hThisInstance,       /* Program Instance handler */
	NULL                 /* No Window Creation data */
);
//創建按鈕
hwndButton = CreateWindow( 
	"BUTTON",   // predefined class 
	"OK",       // button text 
	WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // styles  
	10,         // starting x position 
	10,         // starting y position 
	100,        // button width 
	100,        // button height 
	hwnd,       // parent window 
	NULL,       // No menu 
	(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), 
	NULL        // pointer not needed 
); 
最後,寫這篇文章主要是懷念自己大一時的生活,從一個什麼都不知道的孩子,通過學習C語言,C語言能幹大事開始接觸編程.同時,我認爲這個程序也是非常還的入門程序,希望剛接觸程序的同學也可以看看,編編自己感興趣的程序、寫寫博客、AC題目、編寫遊戲、聊天軟件、移動開發,能從程序和生活中找到一些讓自己心靈美妙的東西.
(By:Eastmount 2014-5-25 夜2點半 原創CSDNhttp://blog.csdn.net/eastmount/)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章