要重画这些小按钮,那首先得获得它们在标题栏的位置,那怎么得到系统中的最小化,最大化,关闭,和图标的位置??开始我直接硬性的定位这些位置,然后贴个小图片上去效果还可以,但是我想在鼠标移动到小按钮上方而没有按下时又改变小按钮的外观,响应WM_NCMOUSEMOVE消息,大概这样:case WM_NCMOUSEMOVE:
{
POINT ptTem;
ptTem.x = GET_X_LPARAM(lParam);
ptTem.y = GET_Y_LPARAM(lParam);
if(PtInRect(&rtButtMin,ptTem))
{
HDC hdc = GetDC(hwnd);
HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP10 ));
BITMAP bm;
GetObject(hbm,sizeof(BITMAP),&bm);
HDC hmemdc = CreateCompatibleDC(hdc);
SelectObject(hmemdc,hbm);
BitBlt(hdc,rtButtMin.left,rtButtMin.top,bm.bmWidth, \ bm.bmHeight,hmemdc,0,0,SRCCOPY);
DeleteDC(hmemdc);
ReleaseDC(hwnd,hdc);
}}
return 0;
rtButtMin是最小化按钮的矩形位置,在响应WM_NCPAINT消息时保存了下来,case WM_NCPAINT:
{
lrst = DefWindowProc(hwnd, uMsg, wParam, lParam);
HDC hdc;
hdc = GetWindowDC(hwnd);
RECT rtWnd, rtTitle;
GetWindowRect(hwnd,&rtWnd);
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
//重画最小button
RECT rtButtons;
int nButtHeight=GetSystemMetrics(SM_CYSMSIZE);
rtButtons.left=rtTitle.right-74;
rtButtons.top=rtTitle.top+6;
rtButtons.right=rtButtMin.left+GetSystemMetrics(SM_CXSMSIZE)+3;
rtButtons.bottom=rtButtMin.top+nButtHeight+8; HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP11 ));
BITMAP bm;
GetObject(hbm,sizeof(BITMAP),&bm);
HDC hmemdc = CreateCompatibleDC(hdc);
SelectObject(hmemdc,hbm);
BitBlt(hdc,rtButtons.left,rtButtons.top,bm.bmWidth,\
bm.bmHeight,hmemdc,0,0,SRCCOPY);
rtButtMin = rtButtons; //保存最小化按钮的位置值
....
}
问题是,无论我怎么把鼠标移动到最小化按钮上,它的外观都改变不了,是不是这几句有问题?:
POINT ptTem;
ptTem.x = GET_X_LPARAM(lParam); //获取鼠标位置X值
ptTem.y = GET_Y_LPARAM(lParam); //获取鼠标位置Y值
if(PtInRect(&rtButtMin,ptTem))
{
...
}请大虾不吝指教!!!
{
POINT ptTem;
ptTem.x = GET_X_LPARAM(lParam);
ptTem.y = GET_Y_LPARAM(lParam);
if(PtInRect(&rtButtMin,ptTem))
{
HDC hdc = GetDC(hwnd);
HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP10 ));
BITMAP bm;
GetObject(hbm,sizeof(BITMAP),&bm);
HDC hmemdc = CreateCompatibleDC(hdc);
SelectObject(hmemdc,hbm);
BitBlt(hdc,rtButtMin.left,rtButtMin.top,bm.bmWidth, \ bm.bmHeight,hmemdc,0,0,SRCCOPY);
DeleteDC(hmemdc);
ReleaseDC(hwnd,hdc);
}}
return 0;
rtButtMin是最小化按钮的矩形位置,在响应WM_NCPAINT消息时保存了下来,case WM_NCPAINT:
{
lrst = DefWindowProc(hwnd, uMsg, wParam, lParam);
HDC hdc;
hdc = GetWindowDC(hwnd);
RECT rtWnd, rtTitle;
GetWindowRect(hwnd,&rtWnd);
//取得标题栏的位置
rtTitle.left = GetSystemMetrics(SM_CXFRAME);
rtTitle.top = GetSystemMetrics(SM_CYFRAME);
rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);
//重画最小button
RECT rtButtons;
int nButtHeight=GetSystemMetrics(SM_CYSMSIZE);
rtButtons.left=rtTitle.right-74;
rtButtons.top=rtTitle.top+6;
rtButtons.right=rtButtMin.left+GetSystemMetrics(SM_CXSMSIZE)+3;
rtButtons.bottom=rtButtMin.top+nButtHeight+8; HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP11 ));
BITMAP bm;
GetObject(hbm,sizeof(BITMAP),&bm);
HDC hmemdc = CreateCompatibleDC(hdc);
SelectObject(hmemdc,hbm);
BitBlt(hdc,rtButtons.left,rtButtons.top,bm.bmWidth,\
bm.bmHeight,hmemdc,0,0,SRCCOPY);
rtButtMin = rtButtons; //保存最小化按钮的位置值
....
}
问题是,无论我怎么把鼠标移动到最小化按钮上,它的外观都改变不了,是不是这几句有问题?:
POINT ptTem;
ptTem.x = GET_X_LPARAM(lParam); //获取鼠标位置X值
ptTem.y = GET_Y_LPARAM(lParam); //获取鼠标位置Y值
if(PtInRect(&rtButtMin,ptTem))
{
...
}请大虾不吝指教!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货