在控制台應用程序下,創建窗口,避開WinMain函數入口


---恢復內容開始---

    一直以來,采用C語言方式的Windows編程的時候,程序的入口必須是WinMain()函數,當開始學習MFC的時候,又覺的MFC的框架結構繁冗混亂,萌生了自己寫一個窗口類編寫Windows程序,同時想和C#一樣避開WinMain的啟動函數,所以在網上搜尋並總結了這樣一篇文章,作為筆記和大家一起學習。稍后如果我有精力的話,我會自己慢慢的封裝一些窗口類,簡化Windows編程的難度。希望能像C#一樣具有很強的邏輯框架。如果有志同道合的新手可以在我的這一篇下面留言,一起組成興趣小組。先聲明,我是個菜鳥。
1
#include "Windows.h" 2 #include<iostream> 3 using namespace std; 4 5 #define MAX_LOADSTRING 100 6 // 全局變量: 7 HINSTANCE hInst; // 當前實例 8 WCHAR* szTitle=TEXT("控制台創建的窗口"); // 標題欄文本 9 WCHAR* szWindowClass=TEXT("WindowClass"); // 主窗口類名 10 11 ATOM MyRegisterClass(HINSTANCE hInstance); 12 BOOL InitInstance(HINSTANCE, int); 13 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 14 15 16 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 17 int main() 18 { 19 //HWND hWnd = ::GetConsoleWindow(); 20 //::ShowWindow(hWnd, SW_HIDE); 21 HINSTANCE hInstance = ::GetModuleHandle(NULL); 22 //::MessageBox(NULL, TEXT("這是一個在控制台應用程序下啟動的窗口的演示"),TEXT( "MessageBox"), MB_OK); 23 //cout << hInstance << endl; 24 25 MyRegisterClass(hInstance); 26 27 // 執行應用程序初始化: 28 if (!InitInstance(hInstance, SW_SHOW)) 29 { 30 return FALSE; 31 } 32 33 //HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32TEST)); 34 35 MSG msg; 36 37 // 主消息循環: 38 while (GetMessage(&msg, nullptr, 0, 0)) 39 { 40 TranslateMessage(&msg); 41 DispatchMessage(&msg); 42 } 43 44 return (int)msg.wParam; 45 } 46 47 48 49 50 // 51 // 函數: MyRegisterClass() 52 // 53 // 目的: 注冊窗口類。 54 // 55 ATOM MyRegisterClass(HINSTANCE hInstance) 56 { 57 WNDCLASSEXW wcex; 58 59 wcex.cbSize = sizeof(WNDCLASSEX); 60 61 wcex.style = CS_HREDRAW | CS_VREDRAW; 62 wcex.lpfnWndProc = WndProc; 63 wcex.cbClsExtra = 0; 64 wcex.cbWndExtra = 0; 65 wcex.hInstance = hInstance; 66 wcex.hIcon = LoadIcon(hInstance, NULL); 67 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); 68 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 69 wcex.lpszMenuName = NULL; 70 wcex.lpszClassName = szWindowClass; 71 wcex.hIconSm = LoadIcon(wcex.hInstance, NULL); 72 73 return RegisterClassExW(&wcex); 74 } 75 76 // 77 // 函數: InitInstance(HINSTANCE, int) 78 // 79 // 目的: 保存實例句柄並創建主窗口 80 // 81 // 注釋: 82 // 83 // 在此函數中,我們在全局變量中保存實例句柄並 84 // 創建和顯示主程序窗口。 85 // 86 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 87 { 88 hInst = hInstance; // 將實例句柄存儲在全局變量中 89 90 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 91 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); 92 93 if (!hWnd) 94 { 95 return FALSE; 96 } 97 98 ShowWindow(hWnd, SW_SHOW); 99 UpdateWindow(hWnd); 100 101 return TRUE; 102 } 103 104 // 105 // 函數: WndProc(HWND, UINT, WPARAM, LPARAM) 106 // 107 // 目的: 處理主窗口的消息。 108 // 109 // WM_COMMAND - 處理應用程序菜單 110 // WM_PAINT - 繪制主窗口 111 // WM_DESTROY - 發送退出消息並返回 112 // 113 // 114 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 115 { 116 switch (message) 117 { 118 case WM_PAINT: 119 { 120 PAINTSTRUCT ps; 121 HDC hdc = BeginPaint(hWnd, &ps); 122 // TODO: 在此處添加使用 hdc 的任何繪圖代碼... 123 EndPaint(hWnd, &ps); 124 } 125 break; 126 case WM_DESTROY: 127 PostQuitMessage(0); 128 break; 129 default: 130 return DefWindowProc(hWnd, message, wParam, lParam); 131 } 132 return 0; 133 }

 

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM