生活随笔
收集整理的這篇文章主要介紹了
WinMain中的Console与main中的Window
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.如何在WinMain中創建一個Console。
調用AllocConsole分配一個Console資源;調用GetStdHandle獲得OS的標準設備(輸入,輸出或錯誤),此函數返回一個句柄,若要使用標準C庫函數,則需要根據獲得的句柄轉化為文件描述符;將此描述符與輸出綁定就可以將它視為stdout/stdin/stderr了。
| #include <windows.h> #include <stdio.h> #include <io.h> #include <fcntl.h> int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ?? DWORD dwBytesWritten; char temp[1]; ?? char* msg1 = "第一條消息/n"; ?? char* msg2 = "第二條消息/n"; ?? char* msg3 = "第三條消息./n"; ?? char* msg4 = "第四條消息/n"; ?? char* msg5 = "第五條消息/n"; ?? //新建一個Console ?? AllocConsole(); ?? //獲得標準輸出的Handle ?? HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);???? ?? //向標準輸出中寫入數據 ?? WriteFile(handle, msg1, strlen(msg1), &dwBytesWritten, NULL); ?? WriteFile(handle, msg2, strlen(msg2), &dwBytesWritten, NULL); ?? ?? //從文件Handle獲得FD ?? int hCrt = _open_osfhandle((long)handle,_O_TEXT);??? ?? //標準C函數調用 ?? write(hCrt, msg3, strlen(msg3));????????????????????????? ?? FILE * hf = _fdopen( hCrt, "w" );??????????????????? ?? char buf[2]; ?? setvbuf( hf, buf, _IONBF, 1 ); ?? //綁定hf至標準輸出 ?? *stdout = *hf; ?? fprintf(hf, msg4);??????????????????????????????????????? ?? printf(msg5); ?? //獲得標準輸入 ?? HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);????????????? // return an OS file handle ?? ReadFile(hIn, temp, 1, &dwBytesWritten, NULL); ?? ?? //釋放Console ?? FreeConsole(); ?? return (0); } |
?
2.如何在main中創建一個窗口并應用消息
將控制臺與創建的窗口分開,我創建一個線程,線程中調用CreateWindow,第一個參數設置為系統預定的”Edit”類。模塊句柄由函數GetModuleHandle獲得。
| #include <windows.h> #include <stdio.h> DWORD WINAPI mainGUI( LPVOID lp) { ?HMODULE hInstance= 0; ?hInstance = GetModuleHandle(NULL); ?HWND?hWnd;? ?MSG msg; ?//創建一個新的窗口 ?hWnd = CreateWindow("EDIT", "由main創建的消息", ?? WS_OVERLAPPEDWINDOW, ?? CW_USEDEFAULT, ?? CW_USEDEFAULT, ?? CW_USEDEFAULT, ?? CW_USEDEFAULT, ?? NULL,NULL, ?? hInstance, ?? NULL); ?if (!hWnd) ???? ?return (1); ?//綁定hWnd與hWindow,向hWindow發送的消息由此線程處理 ?*(HWND*)lp = hWnd; ?ShowWindow(hWnd, SW_SHOW); ?UpdateWindow(hWnd); ?while (GetMessage(&msg, NULL, NULL, NULL)) ?{ ????? TranslateMessage(&msg); ????? DispatchMessage(&msg); ?} ?return (msg.wParam); } int main(int argc, char* argv[]) { ?? DWORD ID;?HWND?hWindow; ?? char szOutput[64]; ?? CreateThread(NULL,0,mainGUI, &hWindow, NULL,&ID); ?? printf("This console created the window above./n "); ?? while (true) { ????? scanf("%s", szOutput); ????? if (!strcmp(szOutput, "quit")) ???????? ?break; ???? ?//發送WM_SETTEXT消息 ????? SendMessage(hWindow,WM_SETTEXT, strlen(szOutput), (LPARAM)szOutput); ?? } ?? return 0; } |
?
正如您所看到的,雖然VC在創建工程時要求我們指定是一個Console或GUI工程,此兩個事例說明GUI與CUI基本上沒有什么本質的區別。
原文:http://www.codeguru.com/cpp/w-d/console/article.php/c3957/ ?
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的WinMain中的Console与main中的Window的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。