GUI中嵌入Console
[转]自其他地方。
WinMain中的Console与main中的Window
![](http://blog.csdn.net/images/trans.gif)
WinMain中的Console与main中的Window
Lanno ckeeke
2006-5-9
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/