您的位置:首页 > 大数据 > 人工智能

WinMain中的Console与main中的Window

2015-01-29 00:07 211 查看
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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: