std::cout很好用,但是在MFC中,一般的变量值输出MessageBox( )来显示,很不方便。下面就实战一下利用std::cout来输出。
1. 利用VC 6.0 MFC App Wizard新建一个基于对话框的单文档应用程序
2. 在工程中新建一个cpp文件,这里起名为MFCConsole.cpp, 代码内容如下
#include
#include
#include "StdAfx.h"
extern "C"
{
int PASCAL WinMain(HINSTANCE inst, HINSTANCE dumb, LPSTR param, int show);
};
int main(int argc, char** argv)
{
char buf[256];
int i;
HINSTANCE inst;
inst = (HINSTANCE)GetModuleHandle(NULL);
buf[0] = 0;
for(i = 1; i< argc; i++)
{
strcat(buf, argv[i]);
strcat(buf, " ");
}
return WinMain(inst, NULL, buf, SW_SHOWNORMAL);
}
4. 在需要的地方尽情使用cout吧。
5. Last but not the least,修改工程属性,project ——>settings——>link——>project options下的subsystem:windows改为subsystem:console
编译
还有其他做法
http://blog.csdn.net/u013468168/article/details/73743510
========================WinMain========================
https://blog.csdn.net/tcjiaan/article/details/8497535
#include
// 必须要进行前导声明
LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam );
//#define CALLBACK __stdcall 专门用来调用Win API而__cdecl是C语言的调用风格
int CALLBACK WinMain(
_In_ HINSTANCE hInstance, // 当前应用程序的实例句柄
_In_ HINSTANCE hPrevInstance, //
_In_ LPSTR lpCmdLine,// 命令行参数
_In_ int nCmdShow// 主窗口的显示方式
)
{
// 类名
WCHAR* cls_Name = L"My Class";
// 【1】设计窗口类
// 有没有标题栏,背景什么颜色,有没有边框,可不可以调整大小等
//==========================【1.1】完全赋值=====================
//WNDCLASS wc;
//wc.cbClsExtra = 0;
//wc.cbWndExtra = 0;
//wc.hCursor = LoadCursor(hInstance, IDC_ARROW);;
//wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);;
//wc.lpszMenuName = NULL;
//wc.style = CS_HREDRAW | CS_VREDRAW;
//wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
我们是把WindowProc赋给了新注册的窗口类,并创建了主窗口,返回一个表示主窗口的句柄,所以,这里MSG中的hwnd指的就是我们的主窗口。
//wc.lpfnWndProc = WindowProc;
//wc.lpszClassName = cls_Name;
//wc.hInstance = hInstance;
//==========================【1.2】利用结构体默认参数赋值=======
//WNDCLASS wc = { sizeof(WNDCLASS) };
WNDCLASS wc = {};
//wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 让窗口自动重绘
wc.style = CS_HREDRAW | CS_VREDRAW;// 强制重新绘制整个客户区的内容
wc.lpfnWndProc = WindowProc;// 这里传入消息处理Windowproc函数!!!!!!!!!!!!!!!!!!!!!!!!!!!
wc.lpszClassName = cls_Name;
wc.hInstance = hInstance;
// 【2】注册窗口类
if (!RegisterClass(&wc))
{
MessageBox(NULL, TEXT("RegisterClass failed, This program requires Windows NT!"), cls_Name, MB_ICONERROR);
return 0;
}
// 【3】创建窗口
HWND hwnd = CreateWindow(
cls_Name, //类名,要和刚才注册的一致
L"我的应用程序", //窗口标题文字
WS_OVERLAPPEDWINDOW, //窗口外观样式
38, //窗口相对于父级的X坐标
20, //窗口相对于父级的Y坐标
480, //窗口的宽度
250, //窗口的高度
NULL, //没有父窗口,为NULL
NULL, //没有菜单,为NULL
hInstance, //当前应用程序的实例句柄
NULL); //没有附加数据,为NULL
if (hwnd == NULL) //检查窗口是否创建成功
return 0;
// 【4】显示窗口
ShowWindow(hwnd, SW_SHOW); // 第二个参数也可以设置为WinMain的最后一个参数nCmdShow
// 【5】更新窗口
UpdateWindow(hwnd);
// 【6】消息循环
MSG msg;
// GetMessage我们会捕捉整个应用程序的消息(NULL),后两个过滤,指定哪个范围内的消息接收,不过滤都设为0
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);// 转换按键信息的,
DispatchMessage(&msg);// 负责把消息传到WindowProc
}
return 0;
}
// 在WinMain后实现
// 消息循环是一个死循环
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam // lParam指示消息处理的返回值(结果)
)
{
switch (uMsg)
{
// 要退出程序,就要先跳出消息循环,和关闭哪个窗口无关
// 窗口销毁会发出WM_Destroy的消息
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
SetTextColor(ps.hdc, RGB(10, 0, 255));//设置文本颜色
//DrawText(ps.hdc, L"你好,WinMain", wcslen(L"你好,WinMain"), &(ps.rcPaint), DT_CENTER);
DrawText(ps.hdc, L"你好,WinMain", -1, &(ps.rcPaint), DT_CENTER);
EndPaint(hwnd, &ps);
break;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam); // 把我们不感兴趣或者没有处理的消息交回给操作系统来处理
}
============ 添加菜单=============
https://blog.csdn.net/tcjiaan/article/details/8510260
D:\VS2010_workspace\WinMain\WinMain\WinMain.cpp以及resource.h
右键添加资源,菜单项
为菜单项添加选中指示
https://blog.csdn.net/tcjiaan/article/details/8513297