澳门皇冠金沙网站-澳门皇冠844网站

热门关键词: 澳门皇冠金沙网站,澳门皇冠844网站

你的第一个Windows程序,仿printf的messagebox弹窗函数

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

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

在编写窗口程序的时候,经常需要使用messagebox函数,不管是调试输入也好,查看变量也罢。这时如果是全字符串的还好,但是如果需要显示数值的内容时,用这个函数就比较麻烦了。需要先使用wsprintf函数执行一遍,然后在使用messagebox函数。远没有在命令行下的printf方便,如果是需要大量弹窗时就更麻烦了。所以决定将这两个函数封装起来,这样messagebox就可以和printf函数一样方便使用了。最终经过两天时间,完成了这个Unicode编码的函数,期间碰到了许多问题,通过一次次单步调试,查看汇编代码最终解决掉了所有问题,函数能正常使用了。

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

C和C 的区别:

图片 1

  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加上好的设计”也能写出非常好的东西。

/* 函数名称: 御坂高级弹窗消息 - 限长2000限参100 Unicode

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

图片 2

/* 函数参数: 第一个是字符串,和printf一样,不定参数个数

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

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

/* 使用说明: 弹窗的内容可以使用任意多个参数,类型暂时只支持 %d 和 %s

  就像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 头文件介绍:

VOID MSKMessageBox(PTSTR string, ...){

 

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

UINT num = 0;

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

windef.h:基本类型定义

__asm{//获取字符串的长度,Unicode版本

  

winbase.h:内核函数

//int 3

 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:用户接口函数

mov eax, string//获得字符串的地址

 

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

sss:

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

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

xor ebx,ebx//清零寄存器

#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)。

mov bx,word ptr [eax]//获取该地址的两字节的值,赋值给bx

 

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

add num,1//计数 1

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

WinMain() 函数的原型为:

add eax, 2//地址偏移 2

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(

test bx, bx//判断bx是不是为0

 

HINSTANCE hInstance, // 当前窗口句柄

jne sss//如果不是0则循环

  ...表示的意思是传入的参数是可变参数个数的,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, // 命令行参数

TCHAR str[2001] = {0};//最多2000的字节内容,如果超过2000就返回错误

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

int nCmdShow // 窗口显示方式

DWORD straddress[100] = { 0 };//字符串参数地址,最多100个

);

INT param = 0;//参数个数

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

INT strnum = 0;//新的字符串的计数

#include

INT arrnum = 0;//数组的计数

int WINAPI WinMain(

DWORD ebpnum = 0;//先获得EBP的基址

HINSTANCE hInstance,

DWORD temp;//用来获取数字的值的

HINSTANCE hPrevInstance,

UINT i;

LPSTR lpCmdLine,

for (i = 0; i< num&& i< 2000; i ){

int nCmdShow

if (string[i] == '%' && (string[i 1] == 'd' || string[i 1] == 's')){

){

param ;

// 调用API 函数MessageBox

__asm{

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

mov dword ptr[ebpnum], ebp

本文由澳门皇冠金沙网站发布于网络操作,转载请注明出处:你的第一个Windows程序,仿printf的messagebox弹窗函数