??????? 最近有個(gè)同學(xué)的程序需要用對(duì)話框的方式實(shí)現(xiàn),但前面都是通過黑框形式完成的,老師突然讓增加一個(gè)界面,本來準(zhǔn)備采用MFC完成的,但后來一想,該程序核心東西是體現(xiàn)在它的算法上,控制臺(tái)的程序并非不好.轉(zhuǎn)念一想,如果使用MFC這樣的方法好像需要再倒騰一遍,想到了大一在"C語言能干大事"中的東西,所以就準(zhǔn)備采用這種形式直接完成,投機(jī)取巧的方法. ??????? 主要是通過調(diào)用Windows API界面的CreateWindows函數(shù)完成,同時(shí)也能創(chuàng)建按鈕,把參數(shù)設(shè)置為button,如果想響應(yīng)該按鈕,只需在回調(diào)函數(shù)中增加消息WM_COMMAND判斷即可.代碼如下:
#include<windows.h>
#include<stdio.h>//聲明回調(diào)函數(shù)
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//主函數(shù) 程序入口
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName[] = TEXT ("HelloWin") ;HWND hwnd ; //用來保存成功創(chuàng)建窗口后返回的句柄MSG msg ; //定義消息結(jié)構(gòu)體變量WNDCLASS wndclass ; //窗體類wndclass.style = CS_HREDRAW | CS_VREDRAW ; //指定窗口風(fēng)格wndclass.lpfnWndProc = WndProc ; 函數(shù)指針,指向處理窗口消息的函數(shù)入口wndclass.cbClsExtra = 0 ; //結(jié)構(gòu)體后附加的字節(jié)數(shù),一般總為0wndclass.cbWndExtra = 0 ; //窗體實(shí)例附加的字節(jié)數(shù),一般總為0wndclass.hInstance = hInstance ; //模塊句柄wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //圖標(biāo)句柄 任務(wù)欄顯示的圖標(biāo)wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光標(biāo)句柄wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景顏色COLOR_BACKGROUNDwndclass.lpszMenuName = NULL ; //菜單名的字符串wndclass.lpszClassName = szAppName ; //自定義類名,不要與其他類名重復(fù)if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("注冊(cè)類失敗!"), szAppName, MB_ICONERROR) ;return 0 ;}int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中//創(chuàng)建窗體APIhwnd = CreateWindow(szAppName,TEXT("畢業(yè)設(shè)計(jì)"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);//顯示窗體的API 傳入需要顯示的窗體句柄和顯示方式ShowWindow(hwnd,iCmdShow);//刷新窗體的APIUpdateWindow(hwnd);//從系統(tǒng)的應(yīng)用程序線程消息隊(duì)列中取得一個(gè)消息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; //窗口實(shí)例static HWND hwndButton[2]; //按鈕句柄switch (message){ case WM_CREATE: //創(chuàng)建按鈕{hInstance = ((LPCREATESTRUCT)lParam)->hInstance;//按鈕1hwndButton[0] = CreateWindow("BUTTON","訓(xùn)練", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 10,10,100,100,hwnd,NULL,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//按鈕2hwndButton[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: //響應(yīng)按鈕消息if((HWND)lParam == hwndButton[0]){MessageBox(NULL,TEXT("是否訓(xùn)練圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);}if((HWND)lParam == hwndButton[1]){MessageBox(NULL,TEXT("是否獲取圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);}return 0;case WM_CLOSE: //關(guān)閉if(IDYES==MessageBox(hwnd,"是否關(guān)閉程序?","提示",MB_YESNO|MB_ICONQUESTION)){DestroyWindow (hwnd); }return 0;case WM_DESTROY: //退出程序PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;
}
?
??????? 程序運(yùn)行結(jié)果如下圖所示: ?
?
??????? 其中主要涉及到的函數(shù)原型如下所示:
?
//創(chuàng)建窗體
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 */
);
//創(chuàng)建按鈕
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
);
??????? 最后,寫這篇文章主要是懷念自己大一時(shí)的生活,從一個(gè)什么都不知道的孩子,通過學(xué)習(xí)C語言,C語言能干大事開始接觸編程.同時(shí),我認(rèn)為這個(gè)程序也是非常還的入門程序,希望剛接觸程序的同學(xué)也可以看看,編編自己感興趣的程序、寫寫博客、AC題目、編寫游戲、聊天軟件、移動(dòng)開發(fā),能從程序和生活中找到一些讓自己心靈美妙的東西. ? (By:Eastmount 2014-5-25 夜2點(diǎn)半 原創(chuàng)CSDN http://blog.csdn.net/eastmount/)
總結(jié)
以上是生活随笔 為你收集整理的C语言API编写窗体界面和按钮 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。