接上篇,原生的控件都不太好看,所以决定自己画一个,稍微处理下消息就能用了。不过,美化这东西是需要天赋的。即使技术再好,没有对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(, , ));
break;
case WM_LBUTTONDOWN:
{
UINT cx=LOWORD(lParam);
UINT cy=HIWORD(lParam);
if(cx>= && cx<=){
if(cy>= && cy<=){
DrawButton(hwnd, RGB(, , ));b=false;
break;
}
}
}
break;
case WM_LBUTTONUP:
{
UINT cx=LOWORD(lParam);
UINT cy=HIWORD(lParam);
if(cx>= && cx<=){
if(cy>= && cy<=){
DrawButton(hwnd, RGB(, , ));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>= && cx<=){
if(cy>= && cy<=){
if(!b){DrawButton(hwnd, RGB(, , ));b=true;}
break;
}
}
if(b){DrawButton(hwnd, RGB(, , ));b=false;}
}
break;
case WM_DESTROY:
PostQuitMessage (); /* 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 ;
}

DrawButton的部分:

void DrawPng(HWND hwnd)
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
Gdiplus::GpGraphics *graphics;
Gdiplus::GpImage *image;
WCHAR file[]={L"D:\\alert.png"};
Gdiplus::DllExports::GdipCreateFromHDC(GetDC(hwnd), &graphics);
Gdiplus::DllExports::GdipLoadImageFromFile(file, &image);
Gdiplus::DllExports::GdipDrawImageRect(graphics, image, , , , );
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[]=_T("Couriew New");
RECT rect={,,,};
BeginPaint(hwnd, &ps);
hdc=GetDC(hwnd);
hrgn=CreateRoundRectRgn(, , , , , );
hbrush=CreateSolidBrush(rgb);//RGB(24, 82, 93)
FillRgn(hdc, hrgn, hbrush);
FrameRgn(hdc, hrgn, (HBRUSH)GetStockObject(GRAY_BRUSH), , );
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(, , ));
of=(HFONT)SendMessage(hwnd, WM_GETFONT, (WPARAM)NULL, (LPARAM)NULL);
ZeroMemory(&lf, sizeof(lf));
GetObject(of, sizeof(lf), &lf);
MoveMemory(&lf.lfFaceName, fn, );
nf=(HFONT)CreateFontIndirect(&lf);
SelectObject(hdc, nf);
DrawText(hdc, " Button", -, &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程序(二)的更多相关文章

  1. 微信小程序二维码推广统计

    微信小程序可以通过生成带参数的二维码,那么这个参数是可以通过APP的页面进行监控的 这样就可以统计每个二维码的推广效果. 今天由好推二维码推出的小程序统计工具HotApp小程序统计也推出了带参数二维码 ...

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

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

  3. 微信小程序-二维码汇总

    小程序二维码在生活中的应用场景很多,比如营销类一物一码,扫码开门,扫码付款等...小程序二维码分两种? 1.普通链接二维码 即跟普通的网站链接生成的二维码是一个意思,这种二维码的局限性如下: 对于普通 ...

  4. 小程序二维码生成接口API

    获取小程序码 我们推荐生成并使用小程序码,它具有更好的辨识度.目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口. 接口A: 适用于需要的码数量较少的业务场景 接口地址: http ...

  5. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

  6. php生成微信小程序二维码源码

    目前有3个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口.第一步:获取   access_token public function getWxAccessToken(){ $appid ...

  7. PHP生成小程序二维码

    /** * [生成小程序二维码] * @return [type] [description] */ public function makeMiniQrcode_do() { begin: $id ...

  8. epic游戏平台如何启用认证器应用程序/二次验证码/谷歌身份验证器?

    1.登陆epic游戏平台,找到二次验证绑定界面 登陆https://www.epicgames.com/store/zh-CN/, 点右上角用户头像-[账户]. 之后点-[密码与安全] 在[双重验证] ...

  9. Java 获取微信小程序二维码(可以指定小程序页面 与 动态参数)

    一.准备工作 微信公众平台接口调试工具 小程序的唯一标识(appid) 小程序的密钥(secret) 二.获取access_token 打开微信公众平台接口调试工具,在参数列表中输入小程序的appid ...

随机推荐

  1. spring-线程池(2)

    继承:http://www.cnblogs.com/crazylqy/p/4220743.html spring设置容器启动时运行线程类(可循环执行) 修改以下两文件, 1.spring设置容器启动时 ...

  2. java虚拟机学习-慢慢琢磨JVM(2)

    1 JVM简介 JVM是我们Javaer的最基本功底了,刚开始学Java的时候,一般都是从“Hello World”开始的,然后会写个复杂点class,然后再找一些开源框架,比如Spring,Hibe ...

  3. $.when()方法翻译

    地址:http://api.jquery.com/jQuery.when/ jQuery.when( deferreds ),returns Promise 正文 Description: Provi ...

  4. VR大时代-全景智慧城市搭建是一个任重而道远的任务

    全景智慧城市搭建是一个任重而道远的任务,但是也促进了实体市场的蓬勃发展与进步.VR技术改变了人们以往的娱乐方式,而全景智慧城市将会彻底改变人们的生活习惯.VR是未来的计算平台,更是人力发展历史中,技术 ...

  5. jmeter跨线程组传值

    在测试过程中,有时候需要jmeter跨线程组传值,jmeter本身又不具备此功能,那么,又该如何实现呢? 其实,我们可以通过BeanShell去实现. 实现过程如下: 1.线程组A中,使用正则表达式提 ...

  6. 默认路由、RIPv2、OSPF、EIGRP配置(全网全通)

    1:默认路由 遇到问题:给r2配置向右的单项默认路由,通过PC1去ping主机PC2,一直显示Request timed out, 解决方法:r2配置如下: r2(config)#ip route 0 ...

  7. poj3417

    poj3417 题意 给出一颗 n 个节点, n - 1 条边的树,再加上 m 条新边,允许删掉树边和新边各一条,问能使树分为两部分的方案数. 分析 在树的基础上加上不重复的新边一定会构成环,那么考虑 ...

  8. 一天搞定CSS: 浮动(float)与inline-block的区别--11

    浮动: 使元素脱离文档流,按照指定的方向发生移动,遇到父级的边界或者相邻的浮动元素就会停下来. inline-block: inline-block是指行内块元素,它具有行内元素和块元素两者的特点,可 ...

  9. 判断客户端使用的是安卓还是苹果,然后加载对应的css文件

    <script type="text/javascript" charset="utf-8"> var browser = { versions: ...

  10. 工程师倾情奉献-Win7 ISO 精简操作说明

    1.前提条件 a)本文档内容只适用于32bit win7 install ISO,其它OS不能保证兼容 b)示范文件为win7-ultimate-rtm-32-en-us-rdvd.iso 2.准备待 ...