大致說來windows編程有兩種方法:
1.windwos c方式(SDK),,
2.c++方式:即對SDK函數(shù)進(jìn)行包裝,,如VC的MFC,BCB的OWL等,如果要深入 下去,,還是要熟悉SDK,。
建立一個(gè)簡單的窗體有如下步驟:
HINSTANCE hInst; // 當(dāng)前實(shí)例句柄 LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);// 回調(diào)函數(shù)
//在此加入全局變量、常量,、函數(shù),、類等,供回調(diào)函數(shù)使用 /* * 主函數(shù): int WINAPI WinMain(HANDLE, HANDLE, LPSTR, int) 初始化窗口,,注冊窗口,,處理消息循環(huán) **/ int WINAPI WinMain( //WINAPI也可用APIENTRY代替 HINSTANCE hInstance, /**當(dāng)前實(shí)例句柄**/
HINSTANCE hPrevInstance,// 前一個(gè)實(shí)例句柄 LPSTR lpCmdLine,/**命令行字符串**/
int nCmdShow // 窗口顯示方式 )
/** 回調(diào)函數(shù): MainWndProc(HWND, UINT, WPARAM, LPARAM) 處理窗口消息,,執(zhí)行有關(guān)代碼 **/ LRESULT CALLBACK MainWndProc( HWND hWnd, /* 窗口句柄 */
UINT message, /* 消息類型 */ WPARAM wParam, /* 附加信息 */
LPARAM lParam) /* 附加信息 */
以下是一個(gè)實(shí)例:
#include <windows.h> #include <stdio.h>
HWND hWnd=NULL; // 保存 Windows 分配給程序的窗口句柄,它是全局的
LRESULT APIENTRY MainWndProc(HWND,UINT,WPARAM,LPARAM); void MyMsgLoop();
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { char clsName[]="myWnd"; WNDCLASS wc; //創(chuàng)建一個(gè)Windows窗體 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;// 窗體風(fēng)格 wc.lpfnWndProc = MainWndProc; // 窗體進(jìn)程的指針 wc.cbClsExtra = 0L; wc.cbWndExtra = 0L; wc.hInstance = hInstance;// 窗體進(jìn)程實(shí)例的句柄,,通過WinMain主函數(shù)傳遞進(jìn)來 wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);// 背景畫刷,,也就是窗口顯示背景顏色 wc.lpszMenuName = NULL; wc.lpszClassName = clsName;// 注冊的Windows類名稱
RegisterClass(&wc);//調(diào)用RegisterClass函數(shù)進(jìn)行注冊 / /具備了創(chuàng)建一個(gè)窗體的信息,開始調(diào)用API函數(shù)CreateWindow來進(jìn)行窗體的創(chuàng)建工作 hWnd = CreateWindow(clsName,"主窗口", WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 100, 100,400, 300,NULL,NULL,hInstance,NULL); // 創(chuàng)建窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); // 顯示窗口 UpdateWindow( hWnd ); // 刷新窗口 //UpdateWindow函數(shù)用于更新窗口,,該函數(shù)更新窗口的時(shí)候會(huì)向指定的窗體的進(jìn)程發(fā)送消息,,如果被更新的客戶區(qū)為空,說明窗體沒有接收到消息,。 MyMsgLoop(); // 進(jìn)入消息循環(huán) return 0; }
LRESULT APIENTRY MainWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam ) {// 消息處理 switch(message) { case WM_CREATE: // 當(dāng)收到建立窗口的消息時(shí),,進(jìn)行處理... return 0; break; case WM_CLOSE: // 當(dāng)收到關(guān)閉窗口的消息時(shí),進(jìn)行處理... MessageBox(NULL,"窗口要關(guān)閉了","消息提示",MB_OK|MB_ICONEXCLAMATION); PostQuitMessage(0); return 0; break; case WM_DESTROY: // 當(dāng)退出消息的時(shí)候,,進(jìn)行處理... MessageBox(NULL,"退出消息了","消息提示",MB_OK|MB_ICONEXCLAMATION); PostQuitMessage(0); return 0; break; default: break; } return (DefWindowProc(hWnd, message, wParam, lParam)); }
void MyMsgLoop() { MSG msg; BOOL receiveMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) { // 消息循環(huán) receiveMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(receiveMessage) { // 有消息 TranslateMessage(&msg); DispatchMessage(&msg); } } }
|