• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

一個關于窗口移動的問題?

烨炜带火 副总经理  2002-05-08 06:38:09
我建立一個CWnd對象,在CWnd中建立一個CStatic對象,我要求窗口上的CStatic上的有鼠標移動時,鼠標變為指向四方的狀態,同時在CStatic對象上按下鼠標左鍵,能夠移動窗口對象,急,請各位高手指教!!!謝謝各位!!
...全文
16 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nne998 2002-05-08
改动过的CMoveWindowStatic,用法一样:

/////////////////////////////////////////////////////////////////////////////
// CMoveWindowStatic message handlers
//==============================================================================
//任意摆布一个控件(拖动、放大、缩小)******************************************
//==============================================================================
HCURSOR ManipulateControl(HWND hwnd, UINT nFlags, int X, int Y, int Precision, BOOL bSetIt)
{
HCURSOR hrReturn;
DWORD SC_MANIPULATE;
CRect rc;
::GetWindowRect(hwnd,&rc);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最左侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (X<=Precision && Y>Precision && Y<rc.Height()-Precision)
{
SC_MANIPULATE = 0xF001;
hrReturn=LoadCursor(NULL,IDC_SIZEWE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最右侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=rc.Width()-Precision && Y>Precision && Y<rc.Height()-Precision)
{
SC_MANIPULATE = 0xF002;
hrReturn=LoadCursor(NULL,IDC_SIZEWE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最上侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision && X<rc.Width()-Precision && Y<=Precision)
{
SC_MANIPULATE = 0xF003;
hrReturn=LoadCursor(NULL,IDC_SIZENS);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision && Y<=Precision)
{
SC_MANIPULATE = 0xF004;
hrReturn=LoadCursor(NULL,IDC_SIZENWSE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=rc.Width()-Precision && Y<=Precision)
{
SC_MANIPULATE = 0xF005;
hrReturn=LoadCursor(NULL,IDC_SIZENESW);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最下侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision && X<rc.Width()-Precision && Y>=rc.Height()-Precision)
{
SC_MANIPULATE = 0xF006;
hrReturn=LoadCursor(NULL,IDC_SIZENS);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision && Y>=rc.Height()-Precision)
{
SC_MANIPULATE = 0xF007;
hrReturn=LoadCursor(NULL,IDC_SIZENESW);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=rc.Width()-Precision && Y>=rc.Height()-Precision)
{
SC_MANIPULATE = 0xF008;
hrReturn=LoadCursor(NULL,IDC_SIZENWSE);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的客户区(移动整个控件)******************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>5 && Y>5 && X<rc.Width()-5 && Y<rc.Height()-5)
{
SC_MANIPULATE = 0xF009;
hrReturn=LoadCursor(NULL,IDC_SIZEALL);
}
else
{
SC_MANIPULATE = 0xF000;
hrReturn=LoadCursor(NULL,IDC_ARROW);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (nFlags & MK_LBUTTON && bSetIt)
{
::ReleaseCapture();
::PostMessage(hwnd,WM_SYSCOMMAND, (WPARAM)SC_MANIPULATE, 0);
}

return hrReturn;
}

void CMoveWindowStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_x=point.x;
m_y=point.y;

ManipulateControl(m_hWnd,nFlags,point.x,point.y,10,TRUE);

CStatic::OnMouseMove(nFlags, point);
}

//处理 WM_SETCURSOR 消息,,,,,啦
BOOL CMoveWindowStatic::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
::SetCursor(ManipulateControl(m_hWnd,0,m_x,m_y,10,FALSE));
return TRUE;

//return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
回复
nne998 2002-05-08
嘿嘿,做好了,,,,,源码:

http://61.140.78.114/fjj/MoveWindowTest2.zip

(76k)
回复
nne998 2002-05-08
我明白你的意思了,,等一下,我做个例子给你。。。
回复
烨炜带火 2002-05-08
上述所有的方法都不行,還有那位高手,請指教!!!
回复
winne_ll 2002-05-08
同意楼上的看法。
回复
nne998 2002-05-08
源代码在:
http://61.140.78.114/fjj/MoveWindowTest.zip

(73k)
回复
nne998 2002-05-08
上面的代码是这样的:

1。自己重载一个CStatic类,例如叫CMoveWindowStatic,处理WM_MOUSEMOVE消息:

void CMoveWindowStatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (nFlags & MK_LBUTTON)
{
//嘿嘿,核心就两行代码,爽啊~~!!!。。。
::ReleaseCapture();
GetParent()->PostMessage(WM_SYSCOMMAND,(WPARAM)0xFFF009,0);
}

CStatic::OnMouseMove(nFlags, point);
}


2。然后在对话框放进一个Static,id比如是: IDC_STATIC_MOVEWINDOW,把notity属性打钩。
在ClassWizard里把IDC_STATIC_MOVEWINDOW加入成员变量例如 m_movewindowstatic 指向CMoveWindowStatic,记得在对话框头文件里
#include "MoveWindowStatic.h"


编译运行,搞定咯。。。。。。。。。。。。。。
回复
nne998 2002-05-08
看我刚才做的例子,绝对简单,绝对经典:

源代码(73k):
http://61.140.78.114/fjj/MoveWindowTest.zip
回复
烨炜带火 2002-05-08
我的窗口是自已建立的
回复
pp_ipr 2002-05-08
你为什么不用控件?
回复
烨炜带火 2002-05-08
我不知道,還有我的CStatic是自已建立的,我如何在窗口中檢測它的消息呢?
回复
iProgram 2002-05-08
试试pp_ipr说的方法。
回复
烨炜带火 2002-05-08
iProgram(小癞蛤蟆)
你好:
我移動的是窗口你的方法不行有沒有其它的辦法!!!
回复
pp_ipr 2002-05-08
光标改变需要监测mouse move,
按鼠标左键移动窗口用下面的这条语句即可,
但statci控件记得属性里选择Notify,
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION);
回复
iProgram 2002-05-08
>在CStatic對象上按下鼠標左鍵,能夠移動窗口對象

移动CStatic对象还是CWnd对象?
try:
void CYourWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
if(poinn Is In Rect of the CStatic Object)
SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0);

}
回复
soandor 2002-05-08
::SetWindowPos(hWnd,NULL,x位置,y位置,长度,宽度,SWP_SHOWNORMAL);
回复
iProgram 2002-05-08
设置某个CWnd鼠标形状:事先插入光标资源.
SetClassLong(GetDlgItem(IDC_STATIC_该STATIC的ID)->GetSafeHwnd(), GCL_HCURSOR, (LONG)AfxGetApp()->LoadCursor(四方状态的光标资源的ID));
回复
soandor 2002-05-08
::SetWindowPos(hWnd,NULL,x位置,y位置,长度,宽度,SWP_SHOWNORMAL);
回复
tanyajun 2002-05-08
OnMouseMove
MoveWindow
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-08 06:38
社区公告

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