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