大发体育娱乐在线-大发体育娱乐官方网站-大发体育娱乐登录网址
做最好的网站

Windows程序设计,C语言编程学习

来源:http://www.dfwstonefabricators.com 作者:操作系统 人气:198 发布时间:2019-11-10
摘要:刚开首学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,重借使将MessageBox那一个WindowsAPI函数的。 C语言是面向进度的,而C++是面向对象的 MessageBox函数是超级多个人刚起头上

  刚开首学习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;
}

LPST途胜 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语言程序也是能够运维的!

Message博克斯() 函数是不菲API中的三个,用于弹出贰个点名风格的对话框,其原型为:

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

WINAPI 为宏定义

#define WINAPI __stdcall,表示函数调用形式,近些日子能够不理会,不影响代码编写,只须要精晓MessageBox()重返值为 int,表示按下的按键。

参数表达

hWnd:该信息框的父窗口句柄,如若此参数为NULL,则该音信框未有具有父窗口。大家不用急于掌握那几个参数,后续会详细讲明。

lpText:音信框的剧情。LPCTSTEnclave 是自定义数据类型,等价于 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

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

MessageBox(NULL, TEXT("你好,应接源世界你!"), TEXT, 1);

也会扭转与地点同样的对话框。

除开开关,uType 还支持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

本文由大发体育娱乐在线发布于操作系统,转载请注明出处:Windows程序设计,C语言编程学习

关键词:

最火资讯