win32自绘按钮,使用GDI+(三)
解决前面的问题。实现鼠标移动进入到按钮的特效。
效果是这样的
鼠标移到按钮上,改变按钮的颜色(这里用的是直接换贴在按钮上的图片)
程序运行
鼠标进入按钮
代码
#ifndef ULONG_PTR
//#define ULONG_PTR unsigned long*
#endif
#include <windows.h>
#define _WIN32_WINNT 0x0500
#include<Winuser.h >
//#include <objidl.h>
#include<tchar.h>
#include<stdlib.h>
#include <gdiplus.h>
#include"resource.h"
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")
#define ID_BUTTON1 1
#define ID_BUTTON2 2
#define ID_MAINPAGE 3
//
#define IDM_MAINPAGE 10
#define IDM_REFRESH 11 HINSTANCE hInst;
HMENU hMenu1;
WNDPROC oldBtnProc;
BOOL btnEntry=FALSE;
void DrawRegn(HDC hdc)
{ } void DrawIco(HDC hdc)
{
Graphics graphics(hdc);
Pen pen1(Color(,,,),);
Pen pen2(Color(,,,),);
Pen pen3(Color(,,,),);
graphics.DrawEllipse(&pen1,,,,);
graphics.DrawEllipse(&pen2,,,,);
graphics.DrawEllipse(&pen3,,,,);//calc
//text
HFONT hOldFont;
HFONT hFont = CreateFont(,,,,,,,,OEM_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH |FF_SCRIPT,"script" );
hOldFont = (HFONT)SelectObject(hdc,hFont);
SetTextColor(hdc,RGB(,,));//
SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,,,"www.cnblogs.com",sizeof("www.cnblogs.com")-);//calc
SelectObject(hdc,hOldFont);
DeleteObject(hFont);
}
void LoadBkImge(HDC hdc)
{
Graphics graphics(hdc);
Image image(L"pic1.png");
graphics.DrawImage(&image,,);
} void FillRec(HDC hdc,Rect myRect,Color* colors,float *positions,int i)
{
Graphics graphics(hdc);
//多彩渐变色
LinearGradientBrush myLinearGradientBrush(
myRect,
Color(,,,),
Color(,,,),
LinearGradientModeVertical
);//LinearGradientModeHorizontal*/ myLinearGradientBrush.SetInterpolationColors(colors, positions, i);
graphics.FillRectangle(&myLinearGradientBrush,myRect);
} LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK BtnProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wndClass;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
hInst=hInstance; // Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); wndClass.style = CS_HREDRAW | CS_VREDRAW|DS_CENTER;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = ;
wndClass.cbWndExtra = ;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = TEXT("Gdiplustest"); RegisterClass(&wndClass);
hWnd = CreateWindow(
TEXT("Gdiplustest"),
TEXT("Gdiplustest"),
WS_OVERLAPPED|WS_POPUP,
CW_USEDEFAULT,
CW_USEDEFAULT,
,
,
NULL,
NULL,
hInstance,
NULL); ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd); while(GetMessage(&msg, NULL, , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} GdiplusShutdown(gdiplusToken);
return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HDC hdc;
static HWND hButton1,hButton2,hMainPage;
PAINTSTRUCT ps;
LPDRAWITEMSTRUCT pdis; switch(message)
{
case WM_CREATE:
{
hdc=GetDC(hWnd);
//窗口居中显示
int scrWidth,scrHeight;
RECT rect;
scrWidth=GetSystemMetrics(SM_CXSCREEN);
scrHeight=GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(hWnd,&rect);
rect.left=(scrWidth-rect.right)/;
rect.top=(scrHeight-rect.bottom)/;
SetWindowPos(hWnd,HWND_TOP,rect.left,rect.top,rect.right,rect.bottom,SWP_SHOWWINDOW);
hButton1=CreateWindow("button","",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,,,,,hWnd,(HMENU)ID_BUTTON1,hInst,NULL);
hButton2=CreateWindow("button","",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,,,,,hWnd,(HMENU)ID_BUTTON2,hInst,NULL);
//
hMainPage=CreateWindow("button","",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,,,,,hWnd,(HMENU)ID_MAINPAGE,hInst,NULL);
oldBtnProc=(WNDPROC)SetWindowLong(hMainPage,GWL_WNDPROC,(long)BtnProc);
//
return ;
}
case WM_SIZE:
return ;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps); Graphics graphics(hdc);
//LoadBkImge(hdc);
//标题栏
Rect myRect(,,,);
Color colors[]={
Color(,,),
Color(,,),
Color(,,),
Color(,,),
Color(,,),
Color(,,)
};
float positions[]={
0.0f,
0.2f,
0.4f,
0.6f,
0.8f,
1.0f
};
FillRec(hdc,myRect,colors,positions,);
//菜单栏
Rect myRect1(,,,);
Color colors1[]={
Color(,,),
Color(,,),
Color(,,),
Color(,,),
Color(,,),
Color(,,)
};
float positions1[]={
0.0f,
0.2f,
0.4f,
0.6f,
0.8f,
1.0f
};
FillRec(hdc,myRect1,colors1,positions1,);
/*SolidBrush brush11(Color(255,240,240,240));
graphics.FillRectangle(&brush11,myRect1);*/ Pen pen1(Color(,,,));
Pen pen2(Color(,,,));
Pen pen3(Color(,,,));
Pen pen4(Color(,,,));
{
graphics.DrawLine(&pen1,,,,);
graphics.DrawLine(&pen2,,,,);
graphics.DrawLine(&pen4,,,,);
}
{
graphics.DrawLine(&pen1,,,,);
graphics.DrawLine(&pen2,,,,);
graphics.DrawLine(&pen1,,,,);
}
{
graphics.DrawLine(&pen1,,,,);
graphics.DrawLine(&pen2,,,,);
}
{
graphics.DrawLine(&pen1,,,,);
graphics.DrawLine(&pen2,,,,);
graphics.DrawLine(&pen1,,,,);
}
//菜单栏
graphics.DrawLine(&pen1,,,,);
graphics.DrawLine(&pen3,,,,); DrawIco(hdc);
EndPaint(hWnd, &ps);
return ;
}
case WM_CTLCOLORBTN:
{
HBRUSH hBrush;
//hBrush = CreateSolidBrush(RGB(255, 0, 0));
hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
return (long)hBrush;
} case WM_COMMAND:
{
switch(wParam)
{
case ID_BUTTON1:
{
ShowWindow(hWnd,SW_SHOWMINIMIZED);
break;
}
case ID_BUTTON2:
{
PostQuitMessage();
break;
}
case ID_MAINPAGE:
{
POINT pt;
pt.x=;
pt.y=;
break;
}
//
} return ; } case WM_DRAWITEM:
{ pdis=(LPDRAWITEMSTRUCT)lParam;
//SetBkMode(pdis->hDC, TRANSPARENT );
//FillRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(NULL));
//FrameRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH)); int cx=pdis->rcItem.right-pdis->rcItem.bottom;
int cy=pdis->rcItem.bottom-pdis->rcItem.top; switch(pdis->CtlID)
{ case ID_BUTTON1:
{
Graphics graphics(pdis->hDC);
Rect rectt(,,,);
Color colors[]={
Color(,,),
Color(,,),
Color(,,),
Color(,,),
};
float positions[]={
0.0f,
0.333333f,
0.666666f,
1.0f
};
//FillRec(pdis->hDC,rectt,colors,positions,4);
{
SolidBrush m_pBrush(Color(,,,));
PointF point1(3.0f, 6.5f);
PointF point2(12.0f, 6.5f);
PointF point3(12.0f, 8.50f);
PointF point4(3.0f, 8.50f);
PointF points[] = {point1, point2, point3,point4};
graphics.FillPolygon(&m_pBrush, points, , FillModeAlternate);
} break;
} case ID_BUTTON2:
{
Graphics graphics(pdis->hDC);
Rect rectt(,,,);
Color colors[]={
Color(,,),
Color(,,),
Color(,,),
Color(,,),
};
float positions[]={
0.0f,
0.33333f,
0.66633f,
1.0f
};
//FillRec(pdis->hDC,rectt,colors,positions,4); SolidBrush m_pBrush(Color(,,,));
//
PointF point1(2.0f, 4.0f);
PointF point2(4.0f, 2.0f);
PointF point3(13.0f, 11.0f);
PointF point4(11.0f, 13.0f);
PointF points[] = {point1, point2, point3,point4};
graphics.FillPolygon(&m_pBrush, points, , FillModeAlternate);
//
PointF point5(13.0f, 4.0f);
PointF point6(11.0f, 2.0f);
PointF point7(2.0f, 11.0f);
PointF point8(4.0f, 13.0f); PointF points2[] = {point5, point6, point7,point8 };
graphics.FillPolygon(&m_pBrush, points2, , FillModeAlternate);
break;
}
case ID_MAINPAGE:
{
if(btnEntry==TRUE)
{
//bitmap2.png
Graphics graphics( pdis->hDC);
Image image(L"bitmap2.png", FALSE);
graphics.DrawImage(&image, ,);
}
else
{
Graphics graphics( pdis->hDC);
Image image(L"bitmap.png", FALSE);
graphics.DrawImage(&image, ,); } //TransparentBitmap(pdis->hDC,hBitmap1,-5,-5,20,20,RGB(255,255,255));
//ReleaseDC(
break;
} }
// if (pdis->itemState & ODS_SELECTED)
{
Graphics graphics(hdc);
SolidBrush brush2(Color(,,,));
//graphics.FillPolygon(&brush2,pointt,7,FillModeAlternate); //InvertRect (pdis->hDC, &pdis->rcItem) ;
} // Draw a focus rectangle if the button has the focus if (pdis->itemState & ODS_FOCUS)
{
pdis->rcItem.left += cx / ;
pdis->rcItem.top += cy / ;
pdis->rcItem.right -= cx / ;
pdis->rcItem.bottom -= cy / ; DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
}
return ;
} case WM_DESTROY:
PostQuitMessage();
return ;
case WM_LBUTTONDOWN:
SendMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,);
return ;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
} LRESULT CALLBACK BtnProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_MOUSEMOVE:
{
if(btnEntry == FALSE)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = ;
tme.hwndTrack = hwnd;
TrackMouseEvent(&tme);
}
break;
}
case WM_MOUSEHOVER:
{
btnEntry = TRUE;
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
break;
}
case WM_MOUSELEAVE:
{
btnEntry = FALSE;
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
break;
}
default:return CallWindowProc(oldBtnProc,hwnd,uMsg,wParam,lParam);
}
}
程序的瑕疵比较多的,但至少实现了功能,以后私底下慢慢完善吧。再封装一下。并且,关于GDI+和自绘按钮就学到这。以后写程序的时候,这个就是起点了,需要实现其他的效果,再研究
win32自绘按钮,使用GDI+(三)的更多相关文章
- win32自绘按钮,使用GDI+(二)
一.解决上一篇的两个问题. 1.按钮背景透明 方法是,在绘制按钮之前,向按钮的父窗口发生WM_CTLCOLORBTN消息.该消息返回一个画刷句柄,系统使用该画刷句柄画出按钮的背景.所以我们在处理这个消 ...
- win32自绘按钮,使用GDI+(一)
第一次写随笔,我本来想将win32窗口的标题栏设置成渐变色,像这样的效果 但发现找不到设置标题栏属性的api,SetWindowLong也只是增减窗口的固定的样式而已.所以想到一个思路,把标题栏去掉, ...
- VC++ WIN32 sdk实现按钮自绘详解.
网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片: 首先建立一个标准的Win32 Application 工程.选择a simple Wi ...
- VC++ WIN32 sdk实现按钮自绘详解 之二(关键是BS_OWNERDRAW和WM_DRAWITEM)
网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片: 首先建立一个标准的Win32 Application 工程.选择a simple Wi ...
- VC++ WIN32 sdk实现按钮自绘详解 之二.
网上找了很多,可只是给出代码,没有详细解释,不便初学者理解.我就抄回冷饭.把这个再拿出来说说. 实例图片: 首先建立一个标准的Win32 Application 工程.选择a simple Wi ...
- MFC自绘按钮的实现,按钮动态效果
最近项目需要实现按钮的动态效果,多方学习,现在终于能实现一些功能了. 过程如下: 第一,新建一MFC对话框应用程序. 第二,删除自带按钮,并添加两个按钮,button1,button2,ID为IDB_ ...
- swing重绘按钮为任意形状图案的方法
swing重绘按钮为任意形状图案的方法 摘自https://www.jb51.net/article/131290.htm 转载 更新时间:2017年12月22日 13:43:00 作者:_Th ...
- Eclipse的debug按钮介绍(三)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- 自绘按钮,添加Color属性(转载)
在标准的Windows程序中所有按钮均没有颜色.因此Delphi提供的所有按钮组件也均无颜色属性,有时你可能做了一个五颜六色的程序界面,而按钮颜色可能很不相称. 在此本人提供一种用自定义组件制作有颜色 ...
随机推荐
- 最近在做外贸网站的时候,需要大量的字体来充实页面,就学习了怎么引用Google Fonts
第一步,FQ进入谷歌官方字体网站:https://fonts.google.com 妥妥的. 第二步,点击你所选择字体演示块的右上角的加号,然后你所选择的字体会形成引用链接以及你所要写的css样式. ...
- [CentOS7服务器] 更改系统时间
未知何故,服务器上的系统时间不对,比实际的UTC快了将近63分钟.在涉及本地文件与远程服务器文件的时间戳校验时,容易产生混淆. 这里把系统时间更正的过程记录如下. 参考资料:http://www.ce ...
- 在Heroku上,安装Wordpress
其實在 Heroku 上安裝 Wordpress 不會很難,不過閱讀之前,你可能先要知道 Heroku 與 git 的基本操作,建議可以先參考以下網站用 Heroku 架設 Wordpress 網站 ...
- 使用VisualVM进行性能分析及调优(转)
VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- Web服务及http协议
HTTP:HyperText Transfer Protocol--超文本传输协议 超链接:能够在文档之间跳转的文本 早起的Web:仅仅是能够实现在文档之间跳转的一种协议 http/0.9:仅支持纯文 ...
- React Native 打包.jsx文件
最近在研究React Native.感觉开发效率确实不错,但jsx语法写起来感觉不怎么顺手. 试用了Sublime Text 3和Visual Studio Code写代码,感觉反应总是慢一拍. 还是 ...
- TCP Socket 通讯(客户端与服务端)
/*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...
- memcpy函数用法
memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...
- 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...
- js实现当前导航菜单高亮显示
为了增加用户体验度,增加网页的易用性和美观度,往往需要把当前导航菜单以特殊方式显示,通常是高亮显示或有不同于其它菜单的背景,有两种方法可以实现,第一种是用纯css来实现,二是用js辅助css来实现,两 ...