Windows SDK,MessageBox()

本文介绍了一个用于格式化输出的C++函数intBoxPrintf,并通过实例展示了如何使用MessageBox函数展示不同类型的提示消息。此外,还介绍了如何让Windows应用程序支持命令行输出,以便更好地进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

格式化输出:

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 ;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值