1、GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。
函数原型:BOOL GradientFill( In HDC hdc,In PTRIVERTEX pVertex,In ULONG nVertex,In PVOID pMesh,In ULONG nMesh, In ULONG ulMode);
hdc:指向目标设备环境的句柄。
pVertex:指向TRIVERTEX结构数组的指针,该数组中的每项定义了三角形顶点。
dwNumVertex:顶点数目。
pMesh:三角形模式下的GRADIENT_TRIANGLE结构数组,或矩形模式下的GRADIENT_RECT结构数组。
dwNumMesh:参数pMesh中的成员数目(这些成员是三角形或矩形)。
dwMode:指定倾斜填充模式。该参数可以包含下列值,这些值的含义为:
GRADIENT_FILL_RECT_H:在该模式下,两个端点表示一个矩形。该矩形被定义成左右边界具有固定颜色(由TRIVERTEX结构指定)。GDI从上至下插入颜色,并填充内部区域。
GRADIENT_FILL_RECT_V:在该模式下,两个端点表示一个矩形。该矩形定义其顶部和底部边界的颜色为固定值(通过TRIVERTEX结构指定),GDI从顶至底部边界插入颜色,并填充内部区域。
GRADIENT_FILL_TRIANGLE:在该模式下,TRIVERTEX结构数组以及描述单个三角形的数组索引序列被传给GDI。GDI在三角形顶点之间进行线性插值,并填充内部区域。在24和32位/像素模式下,绘图是直接进行。在16、8、4和1位/像素模式中进行抖动处理。
2、InsertMenuItem函数在菜单的指定位置插入一个新菜单项。
函数原型:BOOL WINAPI InsertMenuItem(HMENU hMenu,UINT ultem,BOOL fByPosition,LPMENUITEMINFO lpmii );
hMenu:新菜单项将被插入其中的菜单的句柄。
ultem:在其前面插入新菜单项的菜单项的标识符或位置。此参数的含义取决于参数fByPosition的值。
fByFosition:用于确定ultem的含义的值。如果此参数为FALSE,Ultem表示菜单项的标识符。否则,ultem 表示菜单项的位置。
lpmii:指向结构MENUITEMINFO的指针,该结构中包含了新菜单项的信息。
3、CheckMenuRadioItem函数的功能是校核一个指定的菜单项并使其成为一个圆按钮项。
hMenu:包含一组菜单项的菜单的句柄。
idFirst:菜单组里第一个菜单项的标识符或位置。
idLast:菜单组里最后一个菜单项的标识符或位置。
idCheck:要校核的菜单项的标识符或位置。
uFlag:指定idFirst,idLast,idCheck含义的值。如果此参数为MF_BYCOMMAND,则其他参数指定菜单项标识符。如果此参数为MF_BYPOSITION,则其他参数指定菜单项位置。
4、右键菜单:
1、用资源编辑器创建菜单。
2、当我们在窗口上按下鼠标右键,当系统处理WM_RBUTTONUP时会向我们的应用程序发送一条WM_CONTEXTMENU消息,我们通过响应这条消息来决定是否弹出菜单。
3、计算菜单弹出的位置,一般在我们鼠标指针的右下方,该坐标是基于屏幕的,不是窗口的。
4、调用TrackPopupMenu函数显示快捷菜单。
5、因为这种菜单是不属于某个窗口的,它的内存资源不会在窗口销毁时被回收,因此,在TrackPopupMenu返回后要调用DestroyMenu来销毁菜单的资源,释放内存。
case WM_CONTEXTMENU:
{
RECT rect;
POINT pt;
// 获取鼠标右击是的坐标
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
//获取客户区域大小
GetClientRect((HWND)wParam, &rect);
//把屏幕坐标转为客户区坐标
ScreenToClient((HWND)wParam, &pt);
//判断点是否位于客户区域内
if(PtInRect(&rect, pt))
{
//加载菜单资源
HMENU hroot = LoadMenu((HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), MAKEINTRESOURCE(IDR_CONTEXT));
if(hroot)
{
// 获取第一个弹出菜单
HMENU hpop = GetSubMenu(hroot,0);
// 把客户区坐标还原为屏幕坐标
ClientToScreen((HWND)wParam, &pt);
//显示快捷菜单
TrackPopupMenu(hpop,
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
(HWND)wParam,
NULL);
// 用完后要销毁菜单资源
DestroyMenu(hroot);
}
}
}