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

    在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y).唯一的差别是,如果函数只有一个参数,并且该参数的类型为字符串常量 ...

  2. c语言项目开发流程二部曲

    一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...

  3. 建造者模式—设计角度重温DNF中的角色

    应用场景 假设现在我们要设计DNF中的人物角色(鬼剑士.神枪手.魔法师.圣骑士.格斗家).然而,利用面对对象的思想,必须先从实体入手,每一个角色都包含各种装备.武器.配饰,这些就当做要建造的零件,然后 ...

  4. 分享一款在线less转css的神器

          大多数web开发的程序员都了解和使用过Less, LESS是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作 ...

  5. jquery表单序列化

    $(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...

  6. shell多进程

    之前需要多进程程序都是python实现,闲来无事弄了下shell多进程,发现so easy(笑哭) 代码上: #!/bin/bash sleep 10 & sleep 5& wait ...

  7. 抓包工具 - Fiddler(详细介绍)

    Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要 ...

  8. [0] JAVABEAN & JAVASERVLET

    Servlet技术是Sun公司提供的一种实现**页的解决方案,它是基于Java编程语言的WEB服务器端编程技术.Servlet技术也是Jsp技术的基础.一个Servlet程序就是一个实现了特殊接口的J ...

  9. 转 使用HAProxy,PHPRedis,和MySQL支撑10亿请求每周架构细节

    [编者按]在公司的发展中,保证服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求.Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架 ...

  10. 二叉树问题(区间DP好题)

    二叉树问题 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Petya Bulochkin很幸运:他得到了一份在"Macrohard"公司的工作.他想要展现他的才华, ...