格式化输出:
int BoxPrintf( TCHAR * szBuffer, const TCHAR * szFormat, ...)
{
int iReturn ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
iReturn = wvsprintf (szBuffer, szFormat, pArgs) ;
va_end (pArgs) ; //wvsprintf参数三为va_list,而wsprintf为"..."
MessageBox(NULL,szBuffer,TEXT("message"),MB_OK|MB_TOPMOST) ;
return iReturn ;
}
发声:
//MessageBeep (MB_ICONWARNING);//轻dideng
//MessageBeep (MB_ICONASTERISK );//dideng
//MessageBeep ( MB_OK );//DENG,同-1
//MessageBeep ( MB_ICONHAND );//HONG,出错音
//MessageBeep (-1 );//DENG,全拼输入无汉字音
//MessageBeep ( MB_ICONQUESTION );//无声
下面是测试 int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);的标志位
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
//mingw64
//g++ msg.cpp -o msg.exe
struct VALUE
{
UINT type;
string name;
};
VALUE list[]= {
MB_OK,"MB_OK",
MB_ICONEXCLAMATION,"MB_ICONEXCLAMATION",
MB_ICONWARNING,"MB_ICONWARNING",
MB_ICONQUESTION,"MB_ICONQUESTION",
MB_ICONSTOP,"MB_ICONSTOP",
MB_ICONERROR,"MB_ICONERROR",
MB_ICONHAND,"MB_ICONHAND",
MB_ICONASTERISK,"MB_ICONASTERISK",
MB_ICONINFORMATION,"MB_ICONINFORMATION",
MB_SETFOREGROUND,"MB_SETFOREGROUND",
MB_TOPMOST,"MB_TOPMOST",
MB_SYSTEMMODAL,"MB_SYSTEMMODAL",
MB_ABORTRETRYIGNORE,"MB_ABORTRETRYIGNORE",
MB_OKCANCEL,"MB_OKCANCEL",
MB_RETRYCANCEL,"MB_RETRYCANCEL",
MB_YESNO,"MB_YESNO",
MB_YESNOCANCEL,"MB_YESNOCANCEL",
};
VALUE ret_val[]= {
IDABORT,"IDABORT",
IDCANCEL,"IDCANCEL",
IDIGNORE,"IDIGNORE",
IDIGNORE,"IDIGNORE",
IDNO,"IDNO",
IDOK,"IDOK",
IDRETRY,"IDRETRY",
IDYES,"IDYES",
};
int main()
{
int isel=0;
while(1)
{
cout<<"--------------MessageBox() TEST---------------"<<endl;
int len= sizeof(list)/sizeof(*list);
for(int i=0; i<len; i++)
{
printf("%02d.%s\n",i, list[i].name.c_str());
}
cout<<"please select:"<<ends;
int h=scanf("%d",&isel);
if((isel>=len) ||( h==0))//h==0????
{
fflush(stdin);
continue;
}
TCHAR buf[10];
wsprintf(buf,"TEST %d",isel);
printf("MessageBox(NULL,\"%s\",\"%s\",%s);\n",list[isel].name.c_str(),buf,list[isel].name.c_str());
UINT ret=MessageBox(NULL,list[isel].name.c_str(),buf, list[isel].type);
for(size_t j=0; j<sizeof(ret_val)/sizeof(*ret_val); j++)
{
if(ret_val[j].type==ret)
{
cout<<"return:"<<ret<<","<<ret_val[j].name<<endl;
}
}
getchar();
}
return 0;
}
让VS-WINDOWS程序支持命令行输出:
在初始化时加入
case WM_CREATE:
AllocConsole();
break;
在结束时加入
case WM_DESTROY:
FreeConsole();
break;
加入定义:
#pragma warning (disable:4996)// warning C4996: '_vsnprintf': This function or variable may be unsafe. Consider using _vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
#include <stdio.h>
void cmdpf(TCHAR* fmt, ...)
{
TCHAR buf[1024] = {0};
va_list va;
int len,dw;
va_start(va, fmt);
len=wvsprintf(buf,fmt,va);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),buf,len,(LPDWORD)&dw,NULL);
}
然后我们就可以在WINDOWS窗口程序中插入命令行输出,更方便调试
windows sdk
#define _WIN32_WINNT 0x0600
#include <windows.h>
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE:
//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_LBUTTONDOWN:
SendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam);
break;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR class_name[] = TEXT ("HelloWin") ;
WNDCLASSEX wcex;
wcex.cbSize=sizeof(wcex);
wcex.style=CS_HREDRAW | CS_VREDRAW ;
wcex.style|= CS_DBLCLKS;//接收双击消息:WM_LBUTTONDBLCLK ,WM_MBUTTONDBLCLK,WM_NCLBUTTONDBLCLK,WM_NCRBUTTONDBLCLK,WM_RBUTTONDBLCLK
// wcex.style|=CS_NOCLOSE;//禁用关闭按钮
wcex.lpfnWndProc = WndProc ;//LRESULT CALLBACK WindowProc( HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam);
wcex.cbClsExtra = 0 ;
wcex.cbWndExtra = 0 ;
wcex.hInstance = GetModuleHandle(NULL) ;
wcex.hIcon = NULL;//LoadIcon (NULL, IDI_APPLICATION) ;
wcex.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wcex.hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH) ;//BLACK_BRUSH
wcex.lpszMenuName = NULL ;
wcex.lpszClassName = class_name ;
wcex.hIconSm=LoadIcon (NULL, IDI_ERROR) ;
RegisterClassEx (&wcex);
DWORD style=0;
DWORD ex_style=0;
//ex_style|=WS_EX_LAYERED;//支持透明或自绘的窗口,#if(_WIN32_WINNT >= 0x0500)//#define _WIN32_WINNT 0x0600
//WS_EX_TRANSPARENT;//透明,窗口内容为背景
// WS_EX_ACCEPTFILES;//支持拖放消息
//ex_style|=WS_EX_TOPMOST;//顶置
//ex_style=WS_EX_TOOLWINDOW;//没有状态栏图标
//ex_style=WS_EX_PALETTEWINDOW;//#define WS_EX_PALETTEWINDOW (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST) 隐藏状态栏图标,没有最大化,最小化,按WIN+D不会最小化
style= WS_OVERLAPPEDWINDOW; //正常窗口普通窗口,标配
//style&= ~WS_MINIMIZEBOX;// 禁用最小化
//style&= ~WS_MAXIMIZEBOX;// 禁用最大化
//style=WS_POPUP|WS_THICKFRAME;//可改变大小的,带边框无标题窗口
//style |=WS_POPUP|WS_BORDER;//不能改变大小带边框无标题窗口
// style|=WS_SYSMENU;//加入标题图标与菜单
//style=WS_POPUP;//不可改变大小的,无边框无标题窗口
//style=WS_CAPTION;//=0;//等同 WS_CAPTION 一个有标题栏无最大化,最小化,关闭钮,无菜单栏,不可改变大小的的窗口
//style=WS_MINIMIZE;//启动后最小化
//style=WS_MAXIMIZE;//启动后最大化
//style=WS_MAXIMIZE|WS_POPUP;//启动后全屏最大化显示
//style =WS_POPUPWINDOW;//多个菜单栏,可以通过ALT+SPACE弹出系统菜单
HWND hwnd = CreateWindowEx ( ex_style,
class_name, // window class name
TEXT("caption"), // window caption
style, // window style
100, // initial x position
100, // initial y position
400, // initial x size
150, // initial y size
NULL, // parent window handle
NULL, // window menu handle
GetModuleHandle(NULL), // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, SW_SHOW) ;
UpdateWindow (hwnd) ;
MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}