子窗口不能完全显示

Greg_han 2015-04-14 02:04:38
做了一个 模拟“右键菜单”的窗口,菜单窗口在主窗口的边界不能完全显示。怎么完全显示呢?
先创建“菜单窗口”和“菜单的每一项” ,两个类:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#pragma once

#include "vector"
#include "PopMenuLine.h"
// PopMenu

class PopMenu : public CWnd
{
DECLARE_DYNAMIC(PopMenu)

public:
PopMenu();
virtual ~PopMenu();

void SetPopMenuLine(PopMenuLine* pComLine);

void CreatePopMenu(HWND hParen);

std::vector<PopMenuLine*> m_aComLine;
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint();
private:

public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// PopMenu.cpp : 实现文件
//

#include "stdafx.h"
#include "PopMenu.h"
#include <..\src\mfc\afximpl.h>


// PopMenu

IMPLEMENT_DYNAMIC(PopMenu, CWnd)

PopMenu::PopMenu()
{

}

PopMenu::~PopMenu()
{
}


BEGIN_MESSAGE_MAP(PopMenu, CWnd)
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

void PopMenu::SetPopMenuLine( PopMenuLine* pComLine )
{
if(pComLine)
{
m_aComLine.push_back(pComLine);
}
}

void PopMenu::CreatePopMenu(HWND hParen)
{
CWnd* pWnd = FromHandle(hParen);
RECT rc = {0,0,144,255};
WNDCLASS wndclass;
wndclass.hInstance = AfxGetInstanceHandle();
wndclass.lpszClassName = _T("ey");
BOOL bReg = AfxRegisterClass(&wndclass);
//BOOL bRet = CreateEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, _T("#32770"), _T("ey"), WS_POPUP | WS_VISIBLE, rc, pWnd, NULL, NULL);

BOOL bRet = Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rc, pWnd, 123);
if(bRet == 0)
{
DWORD dwErrer = GetLastError();
ASSERT(0);
}
}


// PopMenu 消息处理程序

void PopMenu::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);

if(GetSafeHwnd())
{
//MoveWindow()
}
}


void PopMenu::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages

CRect rect;
GetClientRect(rect);
CBrush brush(RGB(22, 222, 222));
dc.FillRect(rect, &brush);
int nSize = m_aComLine.size();
for (int nL = 0; nL < nSize; ++nL)
{
PopMenuLine* pLine = m_aComLine[nL];
if (pLine)
{
pLine->DrawLine(&dc);
}
}
}


void PopMenu::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

Invalidate();
CWnd::OnMouseMove(nFlags, point);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#pragma once
class PopMenuLine
{
public:
PopMenuLine(void);
~PopMenuLine(void);

void DrawLine(CDC*pDC);

CString m_strText;
CRect m_rect;
};
/////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include "StdAfx.h"
#include "PopMenuLine.h"


PopMenuLine::PopMenuLine(void)
{
}


PopMenuLine::~PopMenuLine(void)
{
}

void PopMenuLine::DrawLine( CDC*pDC )
{
CBrush brush(RGB(20, 200, 20));
pDC->FillRect(m_rect, &brush);
pDC->SetTextColor(RGB(22, 22, 22));
pDC->DrawText(m_strText, m_rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
//一下主窗体调用

PopMenu * pCombox = new PopMenu;
void CMyMenuDlg::OnBnClickedOk()//点击按键后,菜单出现
{
// TODO: 在此添加控件通知处理程序代码
if (pCombox == NULL)
{
return;
}
const int count = 8;
static CString strText[count] = { _T("ceshi"), _T(" 测试0"), _T("测试1"), _T("测试2"), _T("测试3"),_T("测试4"), _T("测试5"), _T("测试6") };

int nHeight = 30;
int nTotalHei = nHeight * pCombox->m_aComLine.size();

CRect rcDlg;
GetDlgItem(IDOK)->GetClientRect(rcDlg);

CRect rect ;
rect.left = rcDlg.left ;
rect.top = rcDlg.top ;
rect.right = rect.left + 100;
rect.bottom = rect.top + nHeight * count;
CRect rcLine = rect;
for (int nL = 0; nL < count; ++nL)
{
PopMenuLine * pLine = new PopMenuLine;
pLine->m_strText = strText[nL];

CRect rcTemp = rcLine;
rcTemp.top = rcTemp.top + nL * nHeight;
rcTemp.bottom = rcTemp.top + nHeight;
pLine->m_rect = rcTemp;
pCombox->SetPopMenuLine(pLine);
}

if (!pCombox->GetSafeHwnd())
{
pCombox->CreatePopMenu(m_hWnd);
}

// ClientToScreen(rect);
pCombox->MoveWindow(rect);
//pCombox->SetWindowPos(this, rect.left, rect.top, rect.Width(), rect.Height(), /*SWP_NOSIZE | */SWP_NOREDRAW /*| SWP_NOZORDER*/);
pCombox->ShowWindow(SW_SHOW);
pCombox->UpdateWindow();
}
...全文
254 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumos 2015-04-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhoujielunzhimi/article/details/8480959 在此基础上做如下修改: Create的时候,加上WS_POPUP样式,去掉WS_VISIBLE样式 然后调用SetWindowPos(..., SWP_SHOWNOACTIVE);显示菜单且不抢焦点 在WM_KILLFOCUS中DestroyWindow(); 在OnLButtonDown中判断点击的是第几个,然后PostMessage到窗口
Greg_han 2015-04-16
  • 打赏
  • 举报
回复
我现在 想改用 Cmenu,请问 如何Cmenu重绘 只有一列图标 系统的Cmenu 太宽了,只想支持若干个 16*16的 图标,如何重绘啊
信阳毛尖 2015-04-15
  • 打赏
  • 举报
回复
引用 3 楼 Greg_han 的回复:
怎么写啊?请VisualEleven 帮我改一下。 BOOL bRet = Create(NULL, NULL, WS_POPUP | WS_VISIBLE, rc, pWnd, 123); 程序崩溃

BOOL CWnd::Create(LPCTSTR lpszClassName,
 LPCTSTR lpszWindowName, DWORD dwStyle,
 const RECT& rect,
 CWnd* pParentWnd, UINT nID,
 CCreateContext* pContext)
{
       // can't use for desktop or pop-up windows (use CreateEx instead)
       ASSERT(pParentWnd != NULL);
       ASSERT((dwStyle & WS_POPUP) == 0);

       return CreateEx(0, lpszClassName, lpszWindowName,
        dwStyle | WS_CHILD,
        rect.left, rect.top,
        rect.right - rect.left, rect.bottom - rect.top,
        pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);
}
ITCraftsMan 2015-04-14
  • 打赏
  • 举报
回复
CWnd::Create函数只能创建非WS_POPUP的窗口风格的窗口。如果要创建WS_POPUP的窗口和有扩展风格的窗口,必须调用CWnd::CreateEx才能搞定。
BrillianceRen 2015-04-14
  • 打赏
  • 举报
回复
BOOL bRet = Create(NULL, NULL, WS_POPUP | WS_VISIBLE, rc, pWnd, 12300);
试试
Greg_han 2015-04-14
  • 打赏
  • 举报
回复
怎么写啊?请VisualEleven 帮我改一下。 BOOL bRet = Create(NULL, NULL, WS_POPUP | WS_VISIBLE, rc, pWnd, 123); 程序崩溃
Eleven 2015-04-14
  • 打赏
  • 举报
回复
子窗口只能在父窗口所在区域内显示,超出的部分是不会显示的。除非你创建一个Popup 或者Overlapp风格的窗口,而不是Child风格的。
oyljerry 2015-04-14
  • 打赏
  • 举报
回复
应该还是你窗口位置,大小的控制代码没有对,自己调整测试一下

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧