用纯 C 编写 WINDOWS 控件

简介: /* my_button.h */#ifndef _MY_BUTTON_H_#define _MY_BUTTON_H_#define BUTTON_POSE_DOWN                -1#define BUTTON_POSE_NORM...
/* my_button.h */
#ifndef _MY_BUTTON_H_
#define _MY_BUTTON_H_
#define BUTTON_POSE_DOWN                -1
#define BUTTON_POSE_NORMAL                0
#define BUTTON_POSE_HOVER                1
typedef struct button {
        RECT rect;
        int state;
        WNDPROC old_wndproc;
        void *old_userdata;
} button_t;
int button_attach_win (button_t *button, HWND hwnd);
#endif
my_button.c
#include <windows.h>
#include "my_button.h"
#pragma warning(disable: 4312)
#pragma warning(disable: 4311)
#define WM_ATTACH_WIN(_obj,_hwnd,_new_userdata,_new_wndproc) /
        (_obj)->old_userdata = (void *)GetWindowLong ( (_hwnd), GWL_USERDATA); /
        (_obj)->old_wndproc = (WNDPROC)GetWindowLong ( (_hwnd), GWL_WNDPROC); /
        SetWindowLong ( (_hwnd), GWL_USERDATA, (LONG)_new_userdata); /
        SetWindowLong ( (_hwnd), GWL_WNDPROC, (LONG)_new_wndproc)
#define WM_DETACH_WIN(_obj,_hwnd) /
        SetWindowLong ( (_hwnd), GWL_USERDATA, (LONG) (_obj)->old_userdata); /
        SetWindowLong ( (_hwnd), GWL_WNDPROC, (LONG) (_obj)->old_wndproc)
LRESULT CALLBACK button_wndproc (HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
        button_t *button;
        PAINTSTRUCT ps;
        HDC hdc;
        button = (button_t *)GetWindowLong (hwnd, GWL_USERDATA);
        switch (message) {
                case WM_KEYDOWN:
                case WM_LBUTTONDOWN:
                        button->state = BUTTON_POSE_DOWN;
                        InvalidateRect (hwnd, NULL, FALSE);
                        return 0;
                case WM_KEYUP:
                case WM_LBUTTONUP:
                        // MessageBox (NULL, L"Clicked", NULL, 0);
                        button->state = BUTTON_POSE_NORMAL;
                        InvalidateRect (hwnd, NULL, FALSE);
                        return 0;
                case WM_MOUSEMOVE:
                        button->state = BUTTON_POSE_HOVER;
                        InvalidateRect (hwnd, NULL, FALSE);
                        return 0;
                case WM_PAINT:
                        hdc = BeginPaint (hwnd, &ps);
                        switch (button->state) {
                        case BUTTON_POSE_HOVER:
                                FillRect (hdc, &button->rect, (HBRUSH)GetStockObject (LTGRAY_BRUSH));
                                break;
                        case BUTTON_POSE_NORMAL:
                                FillRect (hdc, &button->rect, (HBRUSH)GetStockObject (DKGRAY_BRUSH));
                                break;
                        case BUTTON_POSE_DOWN:
                                FillRect (hdc, &button->rect, (HBRUSH)GetStockObject (BLACK_BRUSH));
                                break;
                        default:
                                break;
                        }
                        EndPaint (hwnd, &ps);
                        break;
                default:
                        break;
        }
        return button->old_wndproc (hwnd, message, wparam, lparam);
}
int button_attach_win (button_t *button, HWND hwnd)
{
        WM_ATTACH_WIN (button, hwnd, button, button_wndproc);
        return 1;
}
extern "C" {
#include "my_button.h"
}
button_t button;
void CAboutDlg::OnBnClickedButton1()
{
        button.rect.left = 5;
        button.rect.top = 5;
        button.rect.right = 100;
        button.rect.bottom = 100;
        button_attach_win (&button, m_hWnd);
        Invalidate ();
}
目录
相关文章
|
8月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
156 0
|
C++ Windows
C++ Windows窗口程序:子窗口控件之按钮类button
C++ Windows窗口程序:子窗口控件之按钮类button
957 0
|
API C# Windows
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
C#对Windows窗口或窗口句柄的操作,都是通过 P/Invoke Win32 API 实现的,DllImport引入Windows API操作窗口(句柄),可以实现枚举已打开的窗口、向窗口...
4069 0
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
|
Linux Python Windows
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
|
Windows
WINDOWS如何编写注册表文件
WINDOWS如何编写注册表文件
127 0
|
Windows
Windows程序设计——Windows单选按钮、复选框、分组框控件
Windows程序设计——Windows单选按钮、复选框、分组框控件
652 0
Windows程序设计——Windows单选按钮、复选框、分组框控件
|
IDE Linux Shell
C语言入门开发:Windows下安装vscode编写C语言代码
C语言入门开发:Windows下安装vscode编写C语言代码
356 0
C语言入门开发:Windows下安装vscode编写C语言代码
|
Windows
Windows程序设计——(源代码)Windows单选按钮、复选框、分组框控件
Windows程序设计——(源代码)Windows单选按钮、复选框、分组框控件
217 0
windows窗口中控件的样式
windows窗口中控件的样式一.按钮样式 button BS_AUTO3STATE 创建一个与三态复选框相同的按钮,但该框在用户选择时更改其状态。状态循环通过检查,不确定和清除。 BS_AUTOCHECKBOX 创建一个与复选框相同的按钮,但每次用户选中复选框时,检查状态会自动在已选中和已清除之间切换。
1353 0
|
C# Windows
C#编写Windows服务
一.Windows服务介绍: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。
1076 0