WinMain中的Console与main中的Window

来源:互联网 发布:linux json 解析 编辑:程序博客网 时间:2024/05/11 18:37
1.如何在WinMain中创建一个Console
调用AllocConsole分配一个Console资源;调用GetStdHandle获得OS的标准设备(输入,输出或错误),此函数返回一个句柄,若要使用标准C库函数,则需要根据获得的句柄转化为文件描述符;将此描述符与输出绑定就可以将它视为stdout/stdin/stderr了。
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <io.h>
  4. #include <fcntl.h>
  5. int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  6. {
  7.    DWORD dwBytesWritten; char temp[1];
  8.    char* msg1 = "第一条消息/n";
  9.    char* msg2 = "第二条消息/n";
  10.    char* msg3 = "第三条消息./n";
  11.    char* msg4 = "第四条消息/n";
  12.    char* msg5 = "第五条消息/n";
  13.  
  14.    //新建一个Console
  15.    AllocConsole();
  16.    //获得标准输出的Handle
  17.    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    
  18.    //向标准输出中写入数据
  19.    WriteFile(handle, msg1, strlen(msg1), &dwBytesWritten, NULL);
  20.    WriteFile(handle, msg2, strlen(msg2), &dwBytesWritten, NULL);
  21.   
  22.    //从文件Handle获得FD
  23.    int hCrt = _open_osfhandle((long)handle,_O_TEXT);   
  24.    //标准C函数调用
  25.    write(hCrt, msg3, strlen(msg3));                         
  26.    FILE * hf = _fdopen( hCrt, "w" );                   
  27.    char buf[2];
  28.    setvbuf( hf, buf, _IONBF, 1 );
  29.    //绑定hf至标准输出
  30.    *stdout = *hf;
  31.    fprintf(hf, msg4);                                       
  32.    printf(msg5);
  33.    //获得标准输入
  34.    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);              // return an OS file handle
  35.    ReadFile(hIn, temp, 1, &dwBytesWritten, NULL);
  36.   
  37.    //释放Console
  38.    FreeConsole();
  39.    return (0);
  40. }
 
2.如何在main中创建一个窗口并应用消息
将控制台与创建的窗口分开,我创建一个线程,线程中调用CreateWindow,第一个参数设置为系统预定的”Edit”类。模块句柄由函数GetModuleHandle获得。
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. DWORD WINAPI mainGUI( LPVOID lp)
  5. {
  6.  HMODULE hInstance= 0;
  7.  hInstance = GetModuleHandle(NULL);
  8.  HWND hWnd; 
  9.  MSG msg;
  10.  //创建一个新的窗口
  11.  hWnd = CreateWindow("EDIT",
  12. "由main创建的消息",
  13.    WS_OVERLAPPEDWINDOW,
  14.    CW_USEDEFAULT,
  15.    CW_USEDEFAULT,
  16.    CW_USEDEFAULT,
  17.    CW_USEDEFAULT,
  18.    NULL,NULL,
  19.    hInstance,
  20.    NULL);
  21.  if (!hWnd)
  22.       return (1);
  23.  //绑定hWnd与hWindow,向hWindow发送的消息由此线程处理
  24.  *(HWND*)lp = hWnd;
  25.  ShowWindow(hWnd, SW_SHOW);
  26.  UpdateWindow(hWnd);
  27.  while (GetMessage(&msg, NULL, NULL, NULL))
  28.  {
  29.       TranslateMessage(&msg);
  30.       DispatchMessage(&msg);
  31.  }
  32.  return (msg.wParam);
  33. }
  34.  
  35. int main(int argc, char* argv[])
  36. {
  37.    DWORD ID; HWND hWindow;
  38.    char szOutput[64];
  39.    CreateThread(NULL,0,mainGUI, &hWindow, NULL,&ID);
  40.    printf("This console created the window above./n ");
  41.    while (true) {
  42.       scanf("%s", szOutput);
  43.       if (!strcmp(szOutput, "quit"))
  44.           break;
  45.       //发送WM_SETTEXT消息
  46.       SendMessage(hWindow,WM_SETTEXT, strlen(szOutput), (LPARAM)szOutput);
  47.    }
  48.    return 0;
  49. }
 
正如您所看到的,虽然VC在创建工程时要求我们指定是一个ConsoleGUI工程,此两个事例说明GUICUI基本上没有什么本质的区别。
 
原文:http://www.codeguru.com/cpp/w-d/console/article.php/c3957/
0 0