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/
 

WinMain中的Console与main中的Window相关推荐

  1. 在WinMain中嵌Console窗口

    很多时候,调试GUI程序是很不方便的,通常的做法是使用MessageBox,但是作为一个模态窗口,它经常产生不必要的消息,比如killfocus, setfocus或者paint,从而影响调试的执行过 ...

  2. main方法_错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为:

    错误: 在类 ZiFUChuan.Pyramid 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 Java ...

  3. 解决用C#在visual studio编程中,console一闪而过

    解决用C#在visual studio编程中,console一闪而过. 解决办法: 在主方法的最后加:Console.ReadLine(); 转载于:https://blog.51cto.com/wa ...

  4. golang 中的 init 和 main函数

    首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package ma ...

  5. javascript中的console.log有什么作用?

    javascript中的console.log有什么作用? 主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是aler ...

  6. pycharm中的console退出问题以及console和pycharm各自运行结果不一样的问题

    pycharm中代码: def outer(some_func):def inner():print "before some_func"ret = some_func() # 1 ...

  7. java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

    java.线程池 线程数 此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因 ...

  8. 如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

    此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因此它是在线程" ...

  9. eclipse中在类saolei.Test 中找不到main方法

    粉丝提问:eclipse中在类saolei.Test 中找不到main方法 解决办法: eclipse设置自动保存或者CTRL+S 建议使用更加智能的编译器IDEA

最新文章

  1. 机器学习的若干问题解释
  2. android按钮随机数,Android随机数
  3. iOS自定义的UISwitch按钮
  4. 深层高斯过程最新综述:全面阐述高斯过程的核心动机、数学公式和局限性
  5. Json字符串转对象,使用ObjectMapper方式报错:no String-argument constructor/factory method
  6. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
  7. Hive利用正则Serde导入文件
  8. MXY-API管理系统安装教程
  9. 光敏传感器实验报告_光敏电阻的光敏特性研究实验报告.doc
  10. WordPress非组件实现文章阅读次数-不会php还逞强不用组件的我把网站给玩坏了 ( ̄ー ̄〃)
  11. 科技部:中国131家独角兽企业 名单文字版
  12. (十四)单词之各动词讲解
  13. 数商云化妆品行业电商平台系统解决方案
  14. python快速接手别人的代码_Python 爬虫代码,网上找的别人的,但是报错,求高手指点...
  15. c语言编程怎么样,C语言怎么样,好学吗?
  16. 渗透测试SQL注入——Sqlilabs关卡详解
  17. Panda3D 初学者教程(一)
  18. 【财富空间】卡耐基梅隆首席科学家大卫·伯恩:机器人学与商业机遇
  19. php开启页面错误提示,php如何设置关闭网页错误提示
  20. declare究竟是什么

热门文章

  1. JDK1.10+scala环境的搭建之linux环境(centos6.9)
  2. HTML页面显示缩略所有空格为一格的方法
  3. git学习之时光机穿梭(四)
  4. Eclipse 中切换不同的JDK设置
  5. Knockoutjs 实践入门 (2) 绑定事件
  6. 《OpenGL超级宝典》编程环境配置
  7. 【数据结构与算法】之深入解析“两个数组的交集”的求解思路与算法示例
  8. 226. Invert Binary Tree 翻转二叉树
  9. 大数据WEB阶段 shiro安全控制框架
  10. 【Qt】QModbusServer类