我的 mfc 程序在客户区绘制了以下形状 - 现在我想在此旁边放置一个按钮以重新排列形状。
我知道我可以使用工具栏或菜单按钮,但是有没有办法可以在框旁边放置一个按钮?像这样的东西:
我的 mfc 程序在客户区绘制了以下形状 - 现在我想在此旁边放置一个按钮以重新排列形状。
我知道我可以使用工具栏或菜单按钮,但是有没有办法可以在框旁边放置一个按钮?像这样的东西:
您需要做的就是创建一个CButton
,并适当地定位它。
//.h
#define MYBUTTONID 10000 //or whatever doesn't conflict with your existing resources
public class CMyVew : public CView
{
CButton m_Button;
virtual void OnInitialUpdate();
void RepositionButton();
}
//.cpp
void CMyVew::OnInitialUpdate()
{
//this creates the actual button GUI window
m_Button.Create("Rearrange", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0,0,0,0), this, MYBUTTONID);
RepositionButton();
}
void CMyVew::RepositionButton()
{
//work out button position you need
m_Button.MoveWindow(x, y, width, height);
}
请注意,该按钮只创建一次,并负责绘制本身。你不需要担心它OnDraw()
或类似的事情。
您唯一需要担心的是按钮何时应该移动位置。这就是我分离出RepositionButton()
函数的原因。例如,如果您使用 aCScrollView
并且用户滚动,则按钮窗口对此一无所知,因此您需要对滚动事件做出反应并调用RepositionButton()
ON_BTN_CLICKED
通过添加消息映射,您可以像对任何其他按钮一样对按钮的消息做出反应。
您可以使用 Windows API 创建自己的按钮。主要是获取客户区的窗口句柄,然后在创建按钮时将其用作父句柄。
例如,这里是使用 Windows API 创建按钮的示例。
Create() 方法是 CWnd 类的一部分。
CRect windRect (xColumn, xRow, xColumn + nWidth, xRow + nHeight);
Create (_T("BUTTON"), myCaption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE, windRect, pParentWnd, m_myId);
您需要知道按钮的宽度和高度以及标识符。需要 id 以便您可以在父窗口中找到它并处理来自按钮操作的消息。
查看CreateWindow上的Windows API 文档。