WinMain中的Console与main中的Window
2015-01-29 00:07
211 查看
1.如何在WinMain中创建一个Console。
调用AllocConsole分配一个Console资源;调用GetStdHandle获得OS的标准设备(输入,输出或错误),此函数返回一个句柄,若要使用标准C库函数,则需要根据获得的句柄转化为文件描述符;将此描述符与输出绑定就可以将它视为stdout/stdin/stderr了。
2.如何在main中创建一个窗口并应用消息
将控制台与创建的窗口分开,我创建一个线程,线程中调用CreateWindow,第一个参数设置为系统预定的”Edit”类。模块句柄由函数GetModuleHandle获得。
正如您所看到的,虽然VC在创建工程时要求我们指定是一个Console或GUI工程,此两个事例说明GUI与CUI基本上没有什么本质的区别。
原文:http://www.codeguru.com/cpp/w-d/console/article.php/c3957/
调用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); } |
将控制台与创建的窗口分开,我创建一个线程,线程中调用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; } |
原文:http://www.codeguru.com/cpp/w-d/console/article.php/c3957/
相关文章推荐
- WinMain中的Console与main中的Window
- WinMain中的Console与main中的Window
- Console API 当打开 firebug (也包括 Chrome 等浏览器的自带调试工具),window 下面会注册一个叫做 console 的对象,它
- QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
- IOS_xcode4.2手动添加MainWindow.xib
- com.com.adapterdialog.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$De
- Qt Main Window——主窗口及其主要组成部分
- 关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?
- Activity com.avcit.conference.MainActivity has leaked window错误的理解,已解决!
- _tmain与main,winMain,wmain收藏
- 自己添加 MainWindow.xib
- XPS Main Window
- WPF——找不到资源mainwindow.xaml
- QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout
- xcode4.2中使用xib来运行hello world (MainWindow.xib)
- [导入]Processing A .aspx File From Console Window, Without Using IIS
- GUI with console window
- xcode4.2手动添加MainWindow.xib
- ZetCode PyQt4 tutorial work with menus, toolbars, a statusbar, and a main application window
- VC:状态栏(AfxGetMainWnd()、GetDescendantWindow()、SetPaneInfo()、SetPaneText())