win32SDK的hello,world程序(二)

接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了。不过,美化这东西是需要天赋的。即使技术再好,没有对UI布局调整和良好的审美能力,做出来的东西还是很挫。

主要把消息逻辑和画的过程写出来:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static bool b;
    switch (message)                  /* handle the messages */
    {
        case WM_CREATE:
            b=false;
            break;
        case WM_PAINT:
            //DrawBackground(hwnd);
            DrawButton(hwnd, RGB(24, 82, 93));
            break;
        case WM_LBUTTONDOWN:
            {
                UINT cx=LOWORD(lParam);
                UINT cy=HIWORD(lParam);
                if(cx>=10 && cx<=100){
                        if(cy>=10 && cy<=50){
                            DrawButton(hwnd, RGB(24, 82, 93));b=false;
                            break;
                        }
                }
            }
            break;
        case WM_LBUTTONUP:
            {
                UINT cx=LOWORD(lParam);
                UINT cy=HIWORD(lParam);
                if(cx>=10 && cx<=100){
                        if(cy>=10 && cy<=50){
                            DrawButton(hwnd, RGB(200, 82, 93));b=true;
                            MessageBox(hwnd, "CAUTION: YOU JUST CLICKED ONE CUSTOMER-BUTTON", "", MB_ICONINFORMATION);
                            break;
                        }
                }
            }
            break;
        case WM_MOUSEMOVE:
            {
                UINT cx=LOWORD(lParam);
                UINT cy=HIWORD(lParam);
                if(cx>=10 && cx<=100){
                    if(cy>=10 && cy<=50){
                        if(!b){DrawButton(hwnd, RGB(200, 82, 93));b=true;}
                        break;
                    }
                }
                if(b){DrawButton(hwnd, RGB(24, 82, 93));b=false;}
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don‘t deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
    return 0;
}

DrawButton的部分:

void DrawPng(HWND hwnd)
{
    PAINTSTRUCT ps;
    BeginPaint(hwnd, &ps);
    Gdiplus::GpGraphics *graphics;
    Gdiplus::GpImage *image;
    WCHAR file[256]={L"D:\\alert.png"};
    Gdiplus::DllExports::GdipCreateFromHDC(GetDC(hwnd), &graphics);
    Gdiplus::DllExports::GdipLoadImageFromFile(file, &image);
    Gdiplus::DllExports::GdipDrawImageRect(graphics, image, 66, 12, 32, 32);
    Gdiplus::DllExports::GdipDisposeImage(image);
    Gdiplus::DllExports::GdipDeleteGraphics(graphics);
    EndPaint(hwnd, &ps);
}

void DrawButton(HWND hwnd, COLORREF rgb)
{
    PAINTSTRUCT ps;
    HDC hdc;
    HRGN hrgn;
    HBRUSH hbrush;
    HFONT of, nf;
    LOGFONT lf;
    TCHAR fn[32]=_T("Couriew New");
    RECT rect={10,10,100,50};
    BeginPaint(hwnd, &ps);
    hdc=GetDC(hwnd);
    hrgn=CreateRoundRectRgn(10, 10, 100, 50, 10, 10);
    hbrush=CreateSolidBrush(rgb);//RGB(24, 82, 93)
    FillRgn(hdc, hrgn, hbrush);
    FrameRgn(hdc, hrgn, (HBRUSH)GetStockObject(GRAY_BRUSH), 1, 1);
    SetBkMode(hdc, TRANSPARENT);
    SetTextColor(hdc, RGB(255, 255, 255));
    of=(HFONT)SendMessage(hwnd, WM_GETFONT, (WPARAM)NULL, (LPARAM)NULL);
    ZeroMemory(&lf, sizeof(lf));
    GetObject(of, sizeof(lf), &lf);
    MoveMemory(&lf.lfFaceName, fn, 32);
    nf=(HFONT)CreateFontIndirect(&lf);
    SelectObject(hdc, nf);
    DrawText(hdc, "    Button", -1, &rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);
    SelectObject(hdc, of);
    DeleteObject(nf);
    DeleteObject(hbrush);
    DeleteObject(hrgn);
    ReleaseDC(hwnd, hdc);
    EndPaint(hwnd, &ps);
    DrawPng(hwnd);
}

贴张图:

                                 

win32SDK的hello,world程序(二),布布扣,bubuko.com

时间: 2024-12-14 16:42:28

win32SDK的hello,world程序(二)的相关文章

win32SDK的hello,world程序

首次用Code::Blocks写Win32GUI程序,关于GDI+的引用摸索了半天.SDK写GUI比较累人,以后还是考虑Qt或者其他方式. 代码: /** *code by lichmama from cnblogs.com *@platfrom: code::blocks 13.12/windows xp */ #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #elif defined(_UNICODE) &

phpcms程序二次开发记录

1. phpcms/base.php 中的 pc_base 类 静态类,主要加载各个文件使用.2. pc_base 中 load_sys_func 等带 sys的函数,基本都是加载 lib下文件. func加载functions下: class 加载 class下3. pc_base 中 函数一般第一个参数为文件名,第二个参数为路径,第3个参数有一般为:加载类是否实体化4. pc_base 中 load_app开头则为加载modules下的 functions和class等5. 网站开始入口控制

房地产—客户关系管理系统CRM|软件开发|软件外包|程序二次开发

房地产—客户关系管理系统CRM|软件开发|软件外包|程序二次开发 主要:CRM管理,合同管理,绩效管理 1.CRM管理:新增客户,我的资源,公共资源,客户跟进,待审批客户,报备资源,审核释放,预约到访. 2.合同管理:查询合同,新增合同. 3.绩效管理:新增考核指标,考核进度跟踪,指标进度完成. 为了帮助地产企业秉承专业.人本精神,将客户服务工作持续贯彻于房地产开发的全过程,在产品策划阶段和工程管理阶段,预见性的提供客户需求的产品,将客户服务前置:在销售和售后服务阶段,预见性的为客户提供人性化的

小程序二维码生成接口API

获取小程序码 我们推荐生成并使用小程序码,它具有更好的辨识度.目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口. 接口A: 适用于需要的码数量较少的业务场景 接口地址: https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN 获取 access_token 详见文档 POST 参数说明 注意:通过该接口生成的小程序码,永久有效,数量限制见文末说明,请谨慎使用.用户扫描该码进入小程序后,将直接进入

谷歌app二次验证码与微信小程序二次验证码对比实测

下面我就跟大家实测一下关于两款验证码的使用对比 NO.1:下载安装 谷歌二次验证码下载方式如下: 1.通过扫描交易所中二维码(目前所有交易所中都是提供下载二维码的) 2.手机应用商店搜索"Google Authenticator"进行下载 微信小程序下载方式如下: 1.进入微信直接搜索"二次验证码"即可 1.谷歌需要去下载app(费流量,有wifi和土豪忽略),微信不需要,直接使用! 2.搜索方面谷歌需要一连串的英文字母,比较复杂这个对我而言就比较难接受了(我是英语

PHP生成小程序二维码

/** * [生成小程序二维码] * @return [type] [description] */ public function makeMiniQrcode_do() { begin: $id = input('id');// 获取token $ACCESS_TOKEN = $this->getAccesstoken(); // 准备进入小程序的参数 $param = json_encode(array("path" => "pages/shop/shop?

Ubuntu下用glade和GTK+开发C语言界面程序(二)——gcc常用命令介绍

谈到linux,没人不懂gcc,当然,学过C语言的都该知道gcc,毕竟所有的类C编译器基本都有gcc来构成. GCC的意思随着时间的发展也从最初的GNU C Compiler发展到GNU Compiler Collection,也就是GNU编译器的统称集合.GCC对与操作系统与硬件的的支持,可以说是:无处不在. 一.gcc编译过程 GCC的编译过程要分为四个阶段来进行:预处理阶段,编译阶段,汇编阶段,以及链接阶段. 1.预处理阶段(也称预编译阶段) gcc -E helloworld.c -o

使用Nginx负载均衡搭建高性能.NETweb应用程序二

在文章<使用Nginx负载均衡搭建高性能.NETweb应用程序一>中,让我们对Nginx有了一个初步认识,下面我们将在windows平台下面使用Nginx演示集群部署我们的web应用. 一.下载Nginx部署包 到Nginx官网去下载一个windows平台下面的Nginx部署包,目前我下载的是一个nginx-1.6.2版本的. 二.命令启动服务 启动:start nginx.exe 停止:nginx -s stop 重新加载: nginx -s reload 三.实例搭建 首 选:我们要在我们

最大子数组程序二

一.设计思路:通过输入数组的长度和数组中数的取值范围,产生一个随机数组,并用随机数决定正负号.然后在一次循环中,将数组中的数依次相加,若相加大于0则继续相加,若相加小于0则舍弃之前的数,重新开始相加,并且在循环中记录相加产生的最大的数,即为最大子数组的和. 二.代码:#include<iostream>using namespace std; void main(){    int i,x,y,z;    int s,sum,head,end,h,e;    cout<<"