zoukankan      html  css  js  c++  java
  • Win32 SDK函数MessageBox的模拟实现(C语言版)

    版本一:对于使用掩码传递参数的方法,简单的实现思路:

    #include <stdio.h>
    
    #define MB_OK            0x00000000
    
    #define MB_OKCANCEL 0x00000001
    
     
    
    #define MB_ICONHAND 0x00000010
    
    #define MB_ICONQUESTION 0x00000020
    
     
    
    #define MAX_RESULT 0xFFFFFFFF
    
     
    
    int MessageBox(const char *context, unsigned int type)
    
    {
    
        if(MAX_RESULT == (~MB_ICONHAND | type))
    
        {
    
           printf("	图标: 信息	");
    
        }
    
        else if(MAX_RESULT == (~MB_ICONQUESTION | type))
    
        {
    
           printf("	图标: 问题	");
    
        }
    
     
    
        printf("内容:%s	", context);
    
     
    
        if(MAX_RESULT == (~MB_OKCANCEL | type))
    
        {
    
           printf("按钮:确定 取消	");
    
        }
    
        else if(MAX_RESULT == ((~MB_OK | type)))
    
        {
    
           printf("按钮:确定	");
    
        }
    
        putchar('
    ');
    
        return 0;
    
    }
    
     
    
    int main(int argc, char *argv[])
    
    {
    
        //unsigned int m_o = 0x00000001, m_o1 = 0x00000020, m_o2 = m_o | m_o1;
    
        //printf("%x", ~m_o | m_o2);
    
        
    
        MessageBox("hello, world", MB_OK | MB_ICONHAND);
    
        MessageBox("hello, world", MB_OK | MB_ICONQUESTION);
    
        MessageBox("hello, world", MB_OKCANCEL | MB_ICONHAND);
    
        MessageBox("hello, world", MB_OKCANCEL | MB_ICONQUESTION);
    
        printf("---------------------------------------------------
    ");
    
        MessageBox("hello, world", MB_OK);
    
        MessageBox("hello, world", MB_OKCANCEL);
    
        MessageBox("hello, world", MB_ICONHAND);
    
        MessageBox("hello, world", MB_ICONQUESTION);
    
        
    
        return 0;
    
    }


     

    版本二:充分利用位运算的特性,大大减少了代码量

    #include <stdio.h>
    
    #define MB_OK                       0x00000000
    
    #define MB_OKCANCEL             0x00000001
    
    #define MB_ABORTRETRYIGNORE         0x00000002
    
     
    
    #define MB_ICONHAND 0x00000010
    
    #define MB_ICONQUESTION 0x00000020
    
     
    
    #define MB_TYPEMASK 0x0000000F
    
    #define MB_ICONMASK 0x000000F0
    
     
    
    #define MB_VALIDATE 0x00000000
    
     
    
    char *TypeText[3] = {{"OK"},{"OK CANCEL"},{"ABORT RETRY IGNORE"}};
    
    char *Icon[2] = {{"ICONHAND"}, {"ICONQUESTION"}};
    
     
    
    int MessageBox(const char *context, unsigned int type)
    
    {
    
        printf(TypeText[type & MB_TYPEMASK]);
    
        putchar('
    ');
    
        printf("内容:%s	", context);
    
        putchar('
    ');
    
        if((type & MB_ICONMASK) == MB_VALIDATE)
    
        {
    
           printf("
    -------------------------
    ");
    
           return -1;
    
        }
    
        printf(Icon[((type & MB_ICONMASK)>>4) - 1]);
    
        printf("
    -------------------------
    ");
    
        return 0;
    
    }
    
     
    
    int main(int argc, char *argv[])
    
    {   
    
        MessageBox("hello, world", MB_OK | MB_ICONHAND);
    
        MessageBox("hello, world", MB_OK | MB_ICONQUESTION);
    
        MessageBox("hello, world", MB_OKCANCEL | MB_ICONHAND);
    
        MessageBox("hello, world", MB_OKCANCEL | MB_ICONQUESTION);
    
        MessageBox("hello, world", MB_OK);
    
        MessageBox("hello, world", MB_OKCANCEL);
    
        MessageBox("hello, world", MB_ICONHAND);
    
        MessageBox("hello, world", MB_ICONQUESTION);
    
        return 0;
    
    }
  • 相关阅读:
    导入别人的flex项目出现的问题
    HTTP通信原理
    java 代码的细节优化
    跨服务器之间的session共享
    spring整合hibernate配置文件
    java中时间类型的问题
    Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
    并发处理方案 个人总结
    MsSqlserver 查看锁表与解锁
    c# CTS 基础数据类型笔记
  • 原文地址:https://www.cnblogs.com/a-ray-of-sunshine/p/3416064.html
Copyright © 2011-2022 走看看