win32 API编程之常用控件

一、按钮控件

二、美化按钮

三、windows资源文件.rc

 

 

 

一、按钮控件

1)注意事项

  • 创建按钮一般在WM_CREATE消息中;
  • 系统注册的按钮类名是“button”,不区分大小写。
  • WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口
  • WS_CHILDWINDOW也一样,为了节约几个字母,用WS_CHILD吧。
  • WS_VISIBLE:设置可见。
  • 创建窗口函数讲解

HWND WINAPI CreateWindow( 类名, 显示内容,  风格,  nt x,   int y,   
                int nWidth,  int nHeight,  父窗口,  控件ID,  
                HINSTANCE hInstance,  LPVOID lpParam  );

2)按钮样式

win32 API编程之常用控件

3)获取单选按钮与复选按钮的状态

win32 API编程之常用控件

4)代码实例

#include<windows.h> 
#include<windowsx.h>  //Button_GetCheck的头文件
#include<stdio.h>


//自定义的窗口过程
LRESULT  CALLBACK    MyWindowProc(HWND hWnd, UINT Msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0    
        return 0;

    case  WM_CREATE:
    {
        LPCREATESTRUCT   pcs = (LPCREATESTRUCT)lParam;

        //创建控件或者子窗口

        //普通按钮BS_PUSHBUTTON
        HWND  hBtn=CreateWindow(L"button", L"普通按钮", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON ,30, 30, 80, 30, hWnd,
            (HMENU)1000,//控件ID
            pcs->hInstance, NULL); 

        //单选按钮
        HWND  hBtn1 = CreateWindow(L"button", L"单选按钮", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 30, 70, 80, 30, hWnd,
            (HMENU)1001,//控件ID
            pcs->hInstance, NULL);

        //复选按钮
        HWND  hBtn2 = CreateWindow(L"button", L"复选按钮", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 30, 110, 80, 30, hWnd,
            (HMENU)1002,//控件ID
            pcs->hInstance, NULL);


        return 0;
      }


    case   WM_COMMAND:
    {
         WORD  id = LOWORD(wParam);
         WORD  code= HIWORD(wParam);
         HWND   hCtrl = (HWND)lParam;
         if (id == 1000 &&  code ==  BN_CLICKED)
         {
             MessageBox(hWnd, L"普通按钮被单击!", L"提示",MB_OK); 
         }
         else if (id == 1001)
         {
             MessageBox(hWnd, L"单选按钮被单击!", L"提示", MB_OK);
 
             if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
             {
                 MessageBox(hWnd, L"被选中!", L"提示", MB_OK); 
             }
             else  if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
             {
                 MessageBox(hWnd, L"没选中!", L"提示", MB_OK);
             }
         }
         else if (id == 1002)
         {
             MessageBox(hWnd, L"复选按钮被单击!", L"提示", MB_OK);
/*
             if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED)
             {
                 MessageBox(hWnd, L"被选中!", L"提示", MB_OK);
             }
             else  if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
             {
                 MessageBox(hWnd, L"没选中!", L"提示", MB_OK);
             }
             */
              

             //简写形式((int)(DWORD)SNDMSG((hwndCtl), BM_GETCHECK, 0L, 0L))
             if (Button_GetCheck(hCtrl) == BST_CHECKED)
             {
                 MessageBox(hWnd, L"被选中!", L"提示", MB_OK);
             }
             else  if (Button_GetCheck(hCtrl) == BST_UNCHECKED)
             {
                 MessageBox(hWnd, L"没选中!", L"提示", MB_OK);
             }
         }
    }break;



     
     default:
         break;
    } 
     
    return DefWindowProc(hWnd, Msg, wParam, lParam);
}


int  WINAPI   WinMain(HINSTANCE  hInstance, HINSTANCE  hPrevInstance,
    LPSTR lpCmdLine, int  nShowCmd)
{
    //1.注册窗口类
    WNDCLASS  wnd;
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
    wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
                                                //wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
    wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
    wnd.lpszClassName = L"MrHuang";//窗口类名
    wnd.lpszMenuName = NULL;//菜单资源名称
    wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
    wnd.hInstance = hInstance;//实例句柄
    RegisterClass(&wnd);

    //创建窗口(返回之前发送WM_CREATE)
    HWND    hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

    //显示窗口
    ShowWindow(hWnd, nShowCmd);
    //更新窗口(发送WM_PAINT)
    UpdateWindow(hWnd);


    //消息循环(收到WM_QUIT消息退出)
    MSG  msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//分发消息到窗口过程
    }
}

二、美化按钮

win32 API编程之常用控件

代码实例

#include<windows.h>  
#include<stdio.h>


//自定义的窗口过程
LRESULT  CALLBACK    MyWindowProc(HWND hWnd, UINT Msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0    
        return 0;

    case  WM_CREATE:
    {
        LPCREATESTRUCT   pcs = (LPCREATESTRUCT)lParam; 

        //创建位图按钮
        HWND   hBtn = CreateWindow(L"BuTtOn" /*不区分大小写*/, 
            L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定为图片
            30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL);

        //加载位图
        HBITMAP  hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp",
            IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

        //向控件发送BM_SETIMAGE消息设置按钮图片
        LRESULT  ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);


        return 0;
    }


    case   WM_COMMAND:
    {
        WORD  id = LOWORD(wParam);
        WORD  code = HIWORD(wParam);
        HWND   hCtrl = (HWND)lParam;
        if (id == 1000 && code == BN_CLICKED)
        {
            MessageBox(hWnd, L"普通按钮被单击!", L"提示", MB_OK);
        } 
    }break; 

    default:
        break;
    }

    return DefWindowProc(hWnd, Msg, wParam, lParam);
}


int  WINAPI   WinMain(HINSTANCE  hInstance, HINSTANCE  hPrevInstance,
    LPSTR lpCmdLine, int  nShowCmd)
{
    //1.注册窗口类
    WNDCLASS  wnd;
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
    wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
                                                //wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
    wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
    wnd.lpszClassName = L"MrHuang";//窗口类名
    wnd.lpszMenuName = NULL;//菜单资源名称
    wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
    wnd.hInstance = hInstance;//实例句柄
    RegisterClass(&wnd);

    //创建窗口(返回之前发送WM_CREATE)
    HWND    hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

    //显示窗口
    ShowWindow(hWnd, nShowCmd);
    //更新窗口(发送WM_PAINT)
    UpdateWindow(hWnd);


    //消息循环(收到WM_QUIT消息退出)
    MSG  msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//分发消息到窗口过程
    }
}

三、windows资源文件.rc

1)创建步骤

win32 API编程之常用控件

四、资源相关函数

1)相关函数

win32 API编程之常用控件

2)LoadBitmap函数

win32 API编程之常用控件

3)LoadCursor函数

win32 API编程之常用控件

4)代码实例

#include<windows.h>  
#include<stdio.h>
#include"resource.h"

//自定义的窗口过程
LRESULT  CALLBACK    MyWindowProc(HWND hWnd, UINT Msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0    
        return 0;

    case  WM_CREATE:
    {
        LPCREATESTRUCT   pcs = (LPCREATESTRUCT)lParam; 

        //创建位图按钮
        HWND   hBtn = CreateWindow(L"BuTtOn" /*不区分大小写*/, 
            L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定为图片
            30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL);

        //LoadImage加载位图
        //HBITMAP  hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp",
        //    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);


        //采用LoadBitmap加载位图资源(必须在rc文件中定义)
        HBITMAP  hBmp= LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1) );

        //向控件发送BM_SETIMAGE消息设置按钮图片
        LRESULT  ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);


        return 0;
    }


    case   WM_COMMAND:
    {
        WORD  id = LOWORD(wParam);
        WORD  code = HIWORD(wParam);
        HWND   hCtrl = (HWND)lParam;
        if (id == 1000 && code == BN_CLICKED)
        {
            MessageBox(hWnd, L"普通按钮被单击!", L"提示", MB_OK);
        } 
    }break; 

    default:
        break;
    }

    return DefWindowProc(hWnd, Msg, wParam, lParam);
}


int  WINAPI   WinMain(HINSTANCE  hInstance, HINSTANCE  hPrevInstance,
    LPSTR lpCmdLine, int  nShowCmd)
{
    //1.注册窗口类
    WNDCLASS  wnd;
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
      //加载系统光标,第一个参数为NULL
    //wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
    //加载资源中的光标
    wnd.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR2));


     //加载系统图标,第一个参数为NULL
    //wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    //加载资源中的图标
    wnd.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON2));


    //wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
    wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
    wnd.lpszClassName = L"MrHuang";//窗口类名
    wnd.lpszMenuName = NULL;//菜单资源名称
    wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
    wnd.hInstance = hInstance;//实例句柄
    RegisterClass(&wnd);


    //加载字符串资源
    TCHAR  buf[64] = {0};
    LoadString(hInstance, IDS_STRING1, buf, sizeof(buf));
    LoadString(GetModuleHandle(NULL), IDS_STRING2, buf, sizeof(buf));

    //创建窗口(返回之前发送WM_CREATE)
    HWND    hWnd = CreateWindow(L"MrHuang", buf,
        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

    //显示窗口
    ShowWindow(hWnd, nShowCmd);
    //更新窗口(发送WM_PAINT)
    UpdateWindow(hWnd);


    //消息循环(收到WM_QUIT消息退出)
    MSG  msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//分发消息到窗口过程
    }
}

五、静态文本框

1)创建静态文本

win32 API编程之常用控件

2)静态控件样式

win32 API编程之常用控件

3)设置文本内容SetWindowText

win32 API编程之常用控件

4)可以向静态文本框发送消息来设置图标、位图等

win32 API编程之常用控件

5)代码实例

#include<windows.h> 
#include"resource.h"  
#include<stdio.h>


//自定义的窗口过程
LRESULT  CALLBACK    MyWindowProc(HWND hWnd, UINT Msg,
    WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);//可以使GetMessage返回0    
        return 0;

    case  WM_CREATE:
    {
        LPCREATESTRUCT   pcs = (LPCREATESTRUCT)lParam; 

        //静态文本控件
     HWND  hStatic=    CreateWindow(L"Static", L"这是一个静态文本", WS_CHILD | WS_VISIBLE |WS_BORDER|SS_BITMAP|SS_NOTIFY,
            30, 30,200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL);
     //更改窗口标题
     SetWindowText(hWnd, L"新窗口标题");
     //设置控件(子窗口)内容
     SetWindowText(hStatic, L"更改后的内容!");


     //加载位图
    HBITMAP  hBmp= LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
    
    //向控件发送STM_SETIMAGE消息设置静态控件的位图
    SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp);




        return 0;
    }


    case   WM_COMMAND:
    {

        WORD  id = LOWORD(wParam);//控件ID
        WORD  code = HIWORD(wParam);//消息类型
        HWND   hCtrl = (HWND)lParam;//窗口句柄

        //父窗口接收到子控件发的消息
        if (id == 111  &&  code ==  STN_CLICKED)
        {
            MessageBox(NULL, L"静态文本被点击!", L"提示", MB_OK);
        }
      
    }break;




    default:
        break;
    }

    return DefWindowProc(hWnd, Msg, wParam, lParam);
}


int  WINAPI   WinMain(HINSTANCE  hInstance, HINSTANCE  hPrevInstance,
    LPSTR lpCmdLine, int  nShowCmd)
{
    //1.注册窗口类
    WNDCLASS  wnd;
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));//背景色
    wnd.hCursor = LoadCursor(NULL, IDC_ARROW);//光标
    wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);//图标
                                                //wnd.lpfnWndProc = DefWindowProc;//默认窗口过程函数,用于处理消息
    wnd.lpfnWndProc = MyWindowProc;//自定义的窗口过程函数
    wnd.lpszClassName = L"MrHuang";//窗口类名
    wnd.lpszMenuName = NULL;//菜单资源名称
    wnd.style = CS_HREDRAW | CS_DBLCLKS;//窗口类、样式
    wnd.hInstance = hInstance;//实例句柄
    RegisterClass(&wnd);

    //创建窗口(返回之前发送WM_CREATE)
    HWND    hWnd = CreateWindow(L"MrHuang", L"第一个窗口程序",
        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL);

    //显示窗口
    ShowWindow(hWnd, nShowCmd);
    //更新窗口(发送WM_PAINT)
    UpdateWindow(hWnd);


    //消息循环(收到WM_QUIT消息退出)
    MSG  msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);//翻译消息
        DispatchMessage(&msg);//分发消息到窗口过程
    }
}

 

win32 API编程之常用控件

上一篇:Win32 API样例


下一篇:C#读取XML文件