WinMain中的Console与main中的Window

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 基本上没有什么本质的区别。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值