• 自已动手写控件 我第一次学习写自定义控件


      一直都是用系统的控件, 还从不知道一个控件该怎么去写~~~

      网上的教程太少了, 完全不知道怎么开头~~

      也一直用 RegisterClassEx + CreateWindowEx 创建一个主程序窗口, 却从不知道控件也是通过这种方式来写的.
    看来我们无时无刻不在自己写控件啊~~~

      第1次写控件, 介绍一下我写的这个简单功能控件的创建过程:
        1. 为控件写一个窗口类,指定默认窗口函数,并注册窗口类
        2. 调用 CreateWindowEx 创建该子控件即可, 和创建主窗口完全一样
      
      重点:
        指定的窗口过程必须要为自己的子控件做好相应的消息处理:比如:鼠标消息, WM_PAINT等~~~

      汗, 第1次写这种东西, 没有什么经验, 也没有什么好说的, 就给和我一样不会写控件的一个示范吧, 贴代码, 不多说~~~

      实现的功能是:当点击控件时, 控件的背景颜色会发生变化~~~
      
      没什么特别的意义, 只是想告诉不会写控件的大家, 该怎样开始写一个控件~~~


    // TestControl.c
    #include <windows.h>
    
    LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    
    void RegisterControlClass(HINSTANCE hInstance)
    {
        WNDCLASSEXW wce={0};
    
        wce.cbSize = sizeof(wce);
        wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wce.hInstance = hInstance;
        wce.lpfnWndProc = ControlWindowProc;
        wce.lpszClassName = L"ControlClass";
        wce.style = CS_HREDRAW|CS_VREDRAW;
    
        RegisterClassExW(&wce);
    
    }
     
    
    
    LRESULT CALLBACK ControlWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        static HBRUSH hbrBlack,hbrRed;
        switch(uMsg)
        {
        case WM_CREATE:
            {
                hbrBlack = CreateSolidBrush(RGB(0,0,0));
                hbrRed = CreateSolidBrush(RGB(255,0,0));
    
                return 0;
            }
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc;
                
                hdc = BeginPaint(hWnd,&ps);
                SelectObject(hdc,hbrBlack);
                Rectangle(hdc,0,0,100,50);
                EndPaint(hWnd,&ps);
                return 0;
    
            }
        case WM_LBUTTONDOWN:
            {
                HDC hdc;
                hdc = GetDC(hWnd);
                SelectObject(hdc,hbrRed);
                Rectangle(hdc,0,0,100,50);
                SetTextColor(hdc,RGB(255,0,0));
                TextOutW(hdc,10,10,L"测试控件",4);
                ReleaseDC(hWnd,hdc);
                SetCapture(hWnd);
                return 0;
            }
        case WM_LBUTTONUP:
            {
                HDC hdc;
                hdc = GetDC(hWnd);
                SelectObject(hdc,hbrBlack);
                Rectangle(hdc,0,0,100,50);
                SetTextColor(hdc,RGB(0,0,0));
                TextOutW(hdc,10,10,L"测试控件",4);
                ReleaseDC(hWnd,hdc);
                ReleaseCapture();
                return 0;
            }
        case WM_DESTROY:
            DeleteObject(hbrBlack);
            DeleteObject(hbrRed);
            return 0;
        }
        return DefWindowProcW(hWnd,uMsg,wParam,lParam);
    }
    
    
    LRESULT CALLBACK MainWindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_CREATE:
            {
                HINSTANCE hInstance = GetModuleHandleW(NULL);
    
                CreateWindowExW(0,L"Button",L"按键",WS_CHILD|WS_VISIBLE,0,0,100,50,hWnd,(HMENU)101,hInstance,NULL);
                CreateWindowExW(0,L"ControlClass",L"哈哈",WS_CHILD|WS_VISIBLE,200,200,100,50,hWnd,(HMENU)100,hInstance,NULL);
                CreateWindowExW(0,L"ControlClass",L"呵呵",WS_CHILD|WS_VISIBLE,400,400,100,50,hWnd,(HMENU)102,hInstance,NULL);
    
                return 0;
            }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            break;
        }
        return DefWindowProcW(hWnd,uMsg,wParam,lParam);
    }
    
    int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nShowCmd)
    {
        HWND hWnd;
        WNDCLASSEXW wce = {0};
        MSG msg;
    
        RegisterControlClass(hInstance);
    
        wce.cbSize = sizeof(wce);
        wce.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wce.hCursor = LoadCursor(NULL,IDC_ARROW);
        wce.hIcon = LoadIcon(NULL,IDI_APPLICATION);
        wce.hInstance = hInstance;
        wce.lpfnWndProc = MainWindowProc;
        wce.lpszClassName = L"MyWindowClass";
        wce.style = CS_HREDRAW|CS_VREDRAW;
    
        RegisterClassExW(&wce);
    
        hWnd = CreateWindowExW(0,L"MyWindowClass",L"测试",WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
    
        UpdateWindow(hWnd);
        ShowWindow(hWnd,nShowCmd);
    
        while(GetMessageW(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }   
        return 0;
    }

    有图有真相, 字体有点丑, 不过将就, 系统默认字体都这样:
      

    女孩不哭 @ 2013-05-16 02:47:56 @ http://www.cnblogs.com/nbsofer

  • 相关阅读:
    在Java当中如何优雅地处理临时文件
    lombok插件不建议使用的原因
    linux系统下修改tomcat的端口号时,需要修改的地方
    linux系统下报错为:直接在tomcat的bin目录下生成一个错误文件。
    Linux下修改tomcat端口号
    python实现断点续传下载文件
    Python中下划线---完全解读
    linux  指令 备注
    Linux下高并发socket最大连接数所受的各种限制
    python和pywin32实现窗口查找、遍历和点击
  • 原文地址:https://www.cnblogs.com/memset/p/3081082.html
Copyright © 2020-2023  润新知