Windows程序设计:格式化对话框的筹划

  其实之所以有那七个是因为微软特殊须求满意Windows
9八之后对汉字等别的语言编码的要求,那种要求通过Unicode实现,可是微软本意不是要我们利用Unicode来编程,而是经过选拔“通用”情势,也正是MessageBox();函数,落成区别的编码主要依旧经过IDE集成开发条件下转移分歧的编码格局。回到MessageBox();,后天比较高烧的是,怎么在MessageBox();中贯彻变量的打字与印刷呢?

下载地址

  MessageBox函数是过五人刚初始学习Windows程序设计照旧是Windows
API遭遇的首先个放置函数,那个函数使用的法子是:

图书介绍

用作Windows开发人士的必需参考,涵盖基础知识和中高级主旨,周密地介绍了Windows程序设计所涉及的末节,意在支持读者从高屋建瓴的角度,建立1体化的文化种类,为今后的职业生涯奠定卓绝的功底。全书共3局地二三章。第2~1二章重点介绍基础知识,第三3~1捌章的核心为图形,第三玖~贰三章涉及更加多高档主旨。

《Windows程序设计(第四版
珍藏版)》适合任何层次的Windows程序员阅读和参照,是扶助他们梳理和确立Windows知识类别的佳绩读物。

  MessageBox(NULL, TEXT(“弹出框内容”),
TEXT(“标题”), MB_OK);

 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 }

  MessageBoxA(NULL, “弹出框内容”,
“标题”, MB_OK);   // TEXT可有可无

 

 

 

  初次之外,它还有几个姐妹:

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();函数,具体代码如下:

 

  那么些缓冲区的方法若是用在MessageBox函数里面,就能够兑现打字与印刷变量的办法,比如以下代码:

  

  不过每一遍都写个缓冲区来存放,并且壹不下心忘记行使_snprintf函数,那就GG了,很恐怕产生缓冲区溢出的危殆。由此,那里运用printf原先函数设计的法则,大家也来安插多少个MessageBoxPrintf();函数,用那一个函数来实现格式化输出的意义,要兑现那些函数,首先得参考printf();函数的落到实处原理。

  就像是C语言中常常使用printf函数,这几个函数挺好玩的,应为函数输入的参数是向来不范围个数的,也正是是随机改变的。例如:

  MessageBoxW(NULL, L””, L””, MB_OK);  
                    // 这么些L用来代表Unicode,不得以简不难单

  刚开首上学Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主借使将MessageBox这些Windows
API函数的。

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

  那一个printf函数不仅能够行使三个参数打字与印刷,还可以用来直接打字与印刷变量,可是MessageBox却不可能一贯打字与印刷,这几个引起自个儿的直接思虑。小编先想到的是创制二个缓冲区,利用这一个缓冲区取打字与印刷字符数量。当然打字与印刷的函数得利用sprintf了

  相当于自个儿布置出来二个好像printf的小工具,因为微软确实未有规划Message博克斯中开始展览格式化输出的函数。

// 自己做一个格式化的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;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图