您的位置:澳门新葡8455最新网站 > 澳门新葡8455最新网站 > 格式化对话框的设计,你的首先个Windows程序

格式化对话框的设计,你的首先个Windows程序

发布时间:2019-10-10 23:18编辑:澳门新葡8455最新网站浏览(157)

      刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的。

    C语言是面向过程的,而C++是面向对象的

      MessageBox函数是许多人刚开始学习Windows程序设计或者是Windows API遇到的第一个内置函数,这个函数使用的方式是:

    C和C++的区别:

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

    C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理得到输出控制)。

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

    C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

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

    C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

      MessageBoxW(NULL, L"", L"", MB_OK);                       // 这个L用来表示Unicode,不可以省略

    图片 1

      其实之所以有这两个是因为微软需要满足Windows 98之后对汉字等其他语言编码的需求,这种需求通过Unicode实现,但是微软本意不是要我们使用Unicode来编程,而是通过使用“通用”形式,也就是MessageBox();函数,实现不同的编码主要还是通过IDE集成开发环境下改变不同的编码形式。回到MessageBox();,今天比较头疼的是,怎么在MessageBox();中实现变量的打印呢?

    上次我们说了什么是windows编程?了解到Windows API 编程、Windows编程、Windows SDK 编程是一个概念。

      就像C语言中经常使用printf函数,这个函数挺有趣的,应为函数输入的参数是没有限定个数的,相当于是随机改变的。例如:

    今天我们运用C语言来实现你的第一个真正的Windows程序。

     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 }
    

    windows.h 头文件介绍:

     

    编写Windows程序,首先要包含 windows.h 头文件。windows.h 还包含了其他一些Windows头文件,例如:

      这个printf函数不仅可以使用多个参数打印,还可以用来直接打印变量,但是MessageBox却不能直接打印,这个引起我的直接思考。我先想到的是建立一个缓冲区,利用这个缓冲区取打印字符数据。当然打印的函数得使用sprintf了

    windef.h:基本类型定义

      

    winbase.h:内核函数

     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 }
    

    wingdi.h:用户接口函数

     

    winuser.h: 图形设备接口函数

      这个缓冲区的方法如果用在MessageBox函数里面,就可以实现打印变量的方式,比如以下代码:

    这些头文件定义了Windows的所有数据类型、函数原型、数据结构和符号常量,也就是说,所有的Windows API都在这些头文件中声明。

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

    在C语言中,程序都是“黑屏”的,称为控制台程序(Console Application)。这套教程要讲的是带界面的Windows程序(Windows Application),也称为GUI程序(GUI Application)。

     

    控制台程序以 main() 为入口函数,Windows程序以 WinMain() 为入口函数,动态链接库以 DllMain() 为入口函数,不同的入口函数决定了不同类型的程序。

      但是每次都写个缓冲区来存放,并且一不下心忘记使用_snprintf函数,那就GG了,很可能发生缓冲区溢出的危险。因此,这里利用printf原先函数设计的原理,我们也来设计一个MessageBoxPrintf();函数,用这个函数来实现格式化输出的作用,要实现这个函数,首先得参照printf();函数的实现原理。

    WinMain() 函数的原型为:

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

    int WINAPI WinMain(

     

    HINSTANCE hInstance, // 当前窗口句柄

      ...表示的意思是传入的参数是可变参数个数的,va_start(pArgs, szFormat);表示指向szFormat之后的一个参数,这个函数的许多东西我现在也还没理解过来,之后再来补充,不过现在仿照这个函数我们可以自己写个MessageBoxPrintf();函数,具体代码如下:

    HINSTANCE hPrevInstance, // 前一个窗口句柄,Win32下为NULL(Win16留下的废物,目前已弃用)

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

    LPSTR lpCmdLine, // 命令行参数

      相当于自己设计出来一个类似printf的小工具,因为微软确实没有设计MessageBox中进行格式化输出的函数。

    int nCmdShow // 窗口显示方式

    );

    先不要急于理解这些参数的含义,我先给大家写一个简单的不带黑屏的、真正的Windows程序:

    #include

    int WINAPI WinMain(

    HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPSTR lpCmdLine,

    int nCmdShow

    ){

    // 调用API 函数MessageBox

    int nSelect = MessageBox(NULL, TEXT, TEXT(), MB_OKCANCEL);

    if(nSelect == IDOK){

    MessageBox(NULL, TEXT("你点击了“确定”按钮"), TEXT, MB_OK);

    }else{

    MessageBox(NULL, TEXT("你点击了“取消”按钮"), TEXT, MB_OK);

    }

    return 0;

    }

    运行结果:

    图片 2

    点击“确定”或“取消”按钮,又会弹出一个新的提示框。大家可以亲自运行一下,会有真实的体验。

    原来没有main()函数,没有#include 的C语言程序也是可以运行的!

    MessageBox() 函数是众多API中的一个,用于弹出一个指定风格的对话框,其原型为:

    int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );

    WINAPI 为宏定义

    #define WINAPI __stdcall,表示函数调用方式,暂时可以不理会,不影响代码编写,只需要知道MessageBox()返回值为 int,表示按下的按钮。

    参数说明

    hWnd:该消息框的父窗口句柄,如果此参数为NULL,则该消息框没有拥有父窗口。大家不用急于理解这个参数,后续会详细讲解。

    lpText:消息框的内容。LPCTSTR 是自定义数据类型,等价于 const char *。

    lpCaption:消息框的标题。

    uType:对话框的按钮样式和图标。

    uType 支持的按钮样式:

    图片 3

    这些按钮都是宏定义

    #define MB_OK 0x00000000L

    #define MB_OKCANCEL 0x00000001L

    #define MB_ABORTRETRYIGNORE 0x00000002L

    #define MB_YESNOCANCEL 0x00000003L

    #define MB_YESNO 0x00000004L

    #define MB_RETRYCANCEL 0x00000005L

    你也可以尝试用数字来表示按钮,例如:

    MessageBox(NULL, TEXT("你好,欢迎源世界您!"), TEXT, 1);

    也会生成与上面相同的对话框。

    除了按钮,uType 还支持图标(图标对用户有提醒作用):

    图片 4

    这些图标也都是宏定义:

    #define MB_ICONHAND 0x00000010L

    #define MB_ICONQUESTION 0x00000020L

    #define MB_ICONEXCLAMATION 0x00000030L

    #define MB_ICONASTERISK 0x00000040L

    如果希望同时定义按钮和图标的样式,可以使用或运算|,例如:

    MessageBox(

    NULL,

    TEXT,

    TEXT,

    MB_OKCANCEL | MB_ICONINFORMATION

    );

    把上面的MessageBox换成这个就ok了。运行结果

    与上面的对话框相比,多出了一个图标,同时还能听到提示音。是不是多了一个提示符号在文字的前面啊。

    再看来一下MessageBox() 的返回值。

    MessageBox() 返回被按下的按钮,以数字表示,这些数字都被定义成了宏,如下所示:

    图片 5

    对应的宏定义为:

    #define IDOK 1

    #define IDCANCEL 2

    #define IDABORT 3

    #define IDRETRY 4

    #define IDIGNORE 5

    #define IDYES 6

    #define IDNO 7

    图片 6

    小编推荐一个学C语言/C++的学习裙【 七三零,一三零,二二一 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    总结:

    对于刚刚学完C语言的,学windows编程的,这些都是满满的干货,一定要记住喔。从你学windows编程开始,你就已经告别了难看的windows do界面,只要一步一步走,写一个漂亮的window程序不在话下。这些都是以后学习必须掌握的,先收藏吧!

    这些是C/C++能做的

    服务器开发工程师、人工智能、云计算工程师、信息安全、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

    图片 7图片 8图片 9

    本文由澳门新葡8455最新网站发布于澳门新葡8455最新网站,转载请注明出处:格式化对话框的设计,你的首先个Windows程序

    关键词: