C语言编制程序学习,格式化对话框的希图

时间:2019-10-10 09:55来源:操作系统
刚初叶学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,首即便将MessageBox那些WindowsAPI函数的。 C语言是面向进度的,而C++是面向对象的 MessageBox函数是不菲人刚起先上学Wind

  刚初叶学习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;
}

LPSTQashqai 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:音讯框的内容。LPCTST昂科威 是自定义数据类型,等价于 const char *。

lpCaption:音信框的标题。

uType:对话框的开关样式和Logo。

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

您也足以尝试用数字来代表开关,比如:

Message博克斯(NULL, TEXT("你好,接待源世界你!"), TEXT, 1);

也会调换与地方一样的对话框。

除开按键,uType 还协理Logo(Logo对客户有提示功能):

图片 4

那一个Logo也都以宏定义:

#define MB_ICONHAND 0x00000010L

#define MB_ICONQUESTION 0x00000020L

#define MB_ICONEXCLAMATION 0x00000030L

#define MB_ICONASTERISK 0x00000040L

设若指望同有的时候间定义开关和Logo的体制,能够选用或运算|,比如:

MessageBox(

NULL,

TEXT,

TEXT,

MB_OKCANCEL | MB_ICONINFORMATION

);

把下边包车型地铁MessageBox换到那么些就ok了。运维结果

与地点的对话框对比,多出了贰个Logo,同有时间还能够听见提醒音。是还是不是多了三个提示标记在文字的眼下啊。

再看来一下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

编辑:操作系统 本文来源:C语言编制程序学习,格式化对话框的希图

关键词: