接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了。不过,美化这东西是需要天赋的。即使技术再好,没有对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);
}

贴张图:

                                 

转载于:https://www.cnblogs.com/lichmama/p/3873148.html

win32SDK的hello,world程序(二)相关推荐

  1. 小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈

    小程序之 保存canvas生成商品图片附加小程序二维码 分享到朋友圈 一.概述 需要用到的生成二维码组件(可自行下载添加到小程序根目录utils里):https://github.com/demi52 ...

  2. “程序”二字的五笔字根

    "程序"二字的五笔字根:tkyc 转载于:https://blog.51cto.com/wubizigen2009/161526

  3. 实现微信小程序和支付宝小程序二维码合并

    实现微信小程序和支付宝小程序二维码合并,这样用户就可以通过同一个二维码进入微信或者支付宝啦 1.需要准备可以通过公网访问的服务器 2.微信小程序 打开微信小程序后台->开发(左边)->开发 ...

  4. node 无脑生成小程序二维码图

    RT 新建createwxaqrcode.js: const request = require('request') const fs = require('fs')// eg:生成购物车列表圆形二 ...

  5. 微信小程序 - 二维码数据解析,如何扫码进入开发版测试二维码数据

    1.生成二维码 在小程序开发中,经常需要用到通过分享小程序二维码,进行扫码进入小程序. 官方文档 生成小程序二维码接口,这个生成接口可以放置服务器使用. page:是扫码之后需要打开的小程序页面 sc ...

  6. 微信小程序canva生成图片,长按图片识别小程序二维码详解

    下面这个图片就是通过图片和文字等内容合成的一张带有微信小程序二维码的图片,在小程序内部长按可以识别出来: 基本思路是先将内容用canvas排好版,然后把该canvas转化成图片:图片利用wx.prev ...

  7. PC端生成小程序二维码海报并下载

    我采用了前端截屏+前端生成二维码的方法展示海报并下载 上代码 //截屏组件 import html2canvas from 'html2canvas' //生成二维码组件 import QRCode ...

  8. 【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)

    可在系列教程的基础上继续开发,也可以单独使用 [微信小程序-原生开发]系列教程 效果预览 代码实现 点击触发生成海报 在活动详情页,指定点击某图标/按钮,触发跳转到生成海报的页面 pages\comp ...

  9. php生成小程序二维码出现40001的情况

    php生成小程序二维码出现40001的情况 获取二维码时,小程序的access_token莫名奇妙失效了? 生成小程序二维码时遇到的坑,明明刚获取到的access_token,生成二维码时总是提示说 ...

  10. 小程序如何关联微信小程序二维码,实现二码聚合

    相信大家在停车场遇到过这样的场景,在停车场入场和出场时,不管我们是用微信还是支付宝,只需台扫同一个二维码,自动识别打开各端小程序,并带入参数停车场id和通道id. 这种方式一般统称为二维码聚合或者说是 ...

最新文章

  1. python3 if else 简洁写法 三元运行
  2. hdu2235 机器人的容器
  3. 第一个发现我嫂子有喜的竟然是......
  4. SpringBoot2 集成xJar插件 动态解密jar包,避免源码泄露或反编译
  5. 谷歌浏览器78如何安装拓展程序
  6. 面试官:Java为什么只有值传递?
  7. 微信小程token_微信小程序url与token设置详解
  8. Android ADB 用法
  9. jsp include指令标签
  10. 与或非运算(布尔值/非布尔值)
  11. windows版redis安装教程
  12. nmake命令(windows下的makefile)
  13. 计算机毕业设计ssm小区宠物管理系统k8n96系统+程序+源码+lw+远程部署
  14. 寒假怎么过?经典计算机教材助你弯道超车
  15. html页面打印插件,分享8款网站开发中最好用的打印页面插件
  16. 浪潮全球化的一面:从OEM到JDM,从ODCC到OCP
  17. 55个美丽而独特的网站页眉设计欣赏
  18. mysql ndb存储引擎_NDB存储引擎 | 学步园
  19. ERNIE: 2.0带来了什么
  20. HiC|高通量染色体构象捕获技术

热门文章

  1. Python中list.pop()的使用
  2. 全网首发:warning: #warning “Using deprecated NumPy API, disable it by “ “#defining NPY_NO_DEPRECATED_API
  3. 电脑下边的任务栏不见了_Win7系统电脑任务栏经常自动消失不见的解决方法
  4. win10计算机本地无法连接,Win10没有本地连接怎么办?
  5. docker启动nginx后挂了_使用docker启动nginx并挂载配置nginx
  6. web 流程图工具_要什么第三方流程图制作软件,微软的Visio 2016不香吗?
  7. 字符串中索引位置是什么意思_女孩子左手中指戴戒指什么意思 不同位置各有不同...
  8. BOOST库介绍(二)——BOOST多线程相关库
  9. mocha 的基本介绍expect风格断言库的基本语法
  10. 关于DM8168中移植算法速度慢、效率低的新发现