主要是将MessageBox这个Windows

  刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主借使将Message博克斯那几个Windows API函数的。

  MessageBox函数是无数人刚带头攻读Windows程序设计照旧是Windows API遇到的率先个放置函数,这么些函数使用的办法是:

  MessageBox(NULL, TEXT("弹出框内容"卡塔尔, TEXT("标题"卡塔尔, MB_OK);

  初次之外,它还应该有多少个姐妹:

  MessageBoxA(NULL, "弹出框内容", "标题", MB_OK卡塔尔(英语:State of Qatar);   // TEXT牛溲马勃

  MessageBoxW(NULL, L"", L"", MB_OK卡塔尔国;                       // 这几个L用来表示Unicode,不得以简轻松单

  其实之所以有那七个是因为微软须求知足Windows 98之后对汉字等其他语言编码的急需,这种必要通过Unicode实现,不过微软本意不是要大家选用Unicode来编程,而是通过利用“通用”格局,也等于MessageBox(卡塔尔(قطر‎;函数,完结分化的编码首要照旧通过IDE集成开采条件下转移差别的编码格局。回到MessageBox(卡塔尔(قطر‎;,几近期比较脑仁疼的是,怎么在MessageBox(卡塔尔(英语:State of Qatar);中得以完成变量的打字与印刷呢?

  就如C语言中时时采用printf函数,那些函数挺风趣的,应该为函数输入的参数是未曾节制个数的,约等于是随机改造的。举个例子:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(){
 5
 6     int x=100, y=200, z=300;    
 7     
 8     printf("%d %d %d.n", x, y, z);
 9     system("pause");
10     return 0;
11 }

 

  这些printf函数不只能够采纳八个参数打印,仍然是能够用来一向打印变量,不过MessageBox却不可能直接打印,那么些引起作者的直白思考。笔者先想到的是组建三个缓冲区,利用这一个缓冲区取打字与印刷字符数量。当然打字与印刷的函数得利用sprintf了

新葡萄京官网,  

 1 int main(){
 2     
 3     int a = 12;
 4     char szBuffer[100];             // 使用一个字符数组来做缓冲区
 5 
 6     sprintf(szBuffer, "helloworld %d.n", a);
 7     _snprintf(szBuffer, 100, "helloworld %d.n", a);
 8         // 使用_snprintf函数比较安全,因为可以输入限定字符的个数  
 9 
10     printf("%s.n", szBuffer);
11     puts(szBuffer);                            // 可以使用printf中的%s将szBuffer打印出来,或者用puts直接输出
12     //printf("helloworld.n");
13 
14     system("pause");
15     return 0;
16 }

 

  那个缓冲区的不二秘诀假如用在MessageBox函数里面,就能够完毕打字与印刷变量的方法,举个例子以下代码:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    int a = 12;

    TCHAR szBuffer[100];                  // 通用版本
    _stprintf(szBuffer, TEXT("hello 通用 %d"), a);
    MessageBox(NULL, szBuffer, TEXT("通用"), MB_OK  | MB_ICONINFORMATION);

    return 0;
}

 

  可是每次都写个缓冲区来贮存在,而且一不下心忘记行使_snprintf函数,那就GG了,很或然发生缓冲区溢出的摇摇欲倒。因而,这里运用printf原先函数设计的规律,我们也来规划一个Message博克斯Printf(卡塔尔国;函数,用这几个函数来得以实现格式化输出的作用,要促成这一个函数,首先得参照他事他说加以考察printf(卡塔尔(قطر‎;函数的兑现原理。

int my_printf(const char * szFormat, ...){

    int iReturn;
    va_list pArgs;

    va_start(pArgs, szFormat);
    iReturn = vprintf(szFormat, pArgs);
    va_end(pArgs);

    return iReturn;
}


int main(){

    int x=100, y=200, z=300;

    printf("hello %d, %d, %d.n", x, y, z);        
    my_printf("test_my_printf,哈哈%d %d.n", x, y);

    system("pause");
    return 0;
}

 

  ...表示的意味是流传的参数是可变参数个数的,va_start(pArgs, szFormat卡塔尔(قطر‎;表示指向szFormat之后的壹个参数,这些函数的不菲东西小编后日也还未了然过来,之后再来补充,可是今后依葫芦画瓢这一个函数大家得以和蔼写个MessageBoxPrintf(卡塔尔;函数,具体代码如下:

// 自己做一个格式化的messageboxprintf对话框
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...){

    TCHAR szBuffer[1024];
    va_list pArglist;

    va_start(pArglist, szFormat);
    _vsnprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArglist);
    va_end(pArglist);

    return MessageBox(NULL, szBuffer, szCaption, MB_OK | MB_ICONINFORMATION);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){

    int x=100, y=200, z=300;
    int cxScreen, cyScreen;

    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);

    // MessageBoxW(NULL, L"helloworld", L"biaoti", MB_OK);
    // MessageBoxA(NULL, TEXT("helloworld"), TEXT("biaoti"), MB_OK);
    MessageBoxPrintf(TEXT("我的标题"), TEXT("hello %d %d %d"), x, y, z);    // 把这个函数做好后,直接就可以输出
    MessageBoxPrintf(TEXT("我的屏幕大小"), TEXT("我的屏幕宽度是:%d.n高度是:%d.n"), cxScreen, cyScreen);


    return 0;
}

  约等于本人设计出来三个近似printf的小工具,因为微软实在并未有铺排MessageBox中实行格式化输出的函数。

返回列表