分享
 
 
 

子窗口(控件)对齐类的实现(C++实现)

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

//头文件:

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//文件名称:Alignability.h

//功能说明: 使你的窗口具有子窗口对齐能力。

//用法说明:1,设置父窗口类的句柄。(对于基于对话框的程序,在OnInitDialog函数中调用。)

// 2,调用SetItemAlignable函数,传入一个子窗口句柄及对齐方式(对齐方式可用按位或运算符多选)。

// 如果父窗口句柄及相应子窗口的句柄无效,或子窗口句柄并非父窗口的子窗口,函数调用将失败。

// (对于基于对话框的程序,在OnInitDialog函数中调用。)

// 3,当你的窗口的子控件需要对齐的时候,调用Align函数。(通常在父窗口的WM_SIZE消息

// 处理函数中调用。

//备注:为了使它能用于其它C系统编程环境,我避免了对MFC类的使用,这让代码有点发福,如果要用于C

// 语言SDK编程就要将vector用数组代替...

// 2005-2-28. writer by txf.

// 如果你有更好的改进,记得通知我:tangxinfa@sina.com

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef ALIGNABILITY_H_

#define ALIGNABILITY_H_

#include "windows.h"

#include <vector>

using std::vector;

enum AlignType{

leftalign = 1,

topalign = 2,

rightalign = 4,

bottomalign = 8

};

class CAlignability

{

public:

BOOL SetParentHwnd(HWND hwndParent);

HWND GetParentHwnd() const;

void Align(); //进行对齐。

struct AlignCfg{

public:

AlignCfg(HWND hwndChild, AlignType eType, RECT oriEDs)

:m_hwndChild(hwndChild), m_oriEDs(oriEDs), m_eType(eType){}

HWND m_hwndChild;//子窗口的句柄.

AlignType m_eType; //对齐方式.

RECT m_oriEDs; //子控件初始时(通常为设计时)到父窗口的四边的边距.

};

CAlignability(HWND hwndParent);

virtual ~CAlignability();

BOOL SetItemAlignable(UINT nSubWndId, AlignType aligntype);

BOOL SetItemAlignable(HWND hwndChild, AlignType aligntype);

private:

HWND m_hwndParent;

vector<AlignCfg> m_alignset;

};

#endif //ALIGNABILITY_H_

//实现文件:

// Alignable.cpp: implementation of the CAlignable class.

//

//////////////////////////////////////////////////////////////////////

#include "Alignability.h"

#include <assert.h>

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CAlignability::CAlignability(HWND hwndParent)

:m_hwndParent(hwndParent)

{

assert(::IsWindow(m_hwndParent));

}

CAlignability::~CAlignability()

{

}

BOOL CAlignability::SetItemAlignable(UINT nSubWndId, AlignType aligntype)

{

HWND hwndChild(GetDlgItem(m_hwndParent, nSubWndId));

return SetItemAlignable(hwndChild, aligntype);

}

BOOL CAlignability::SetItemAlignable(HWND hwndChild, AlignType aligntype)

{

if(! ::IsWindow(m_hwndParent))

{

assert(0);//Parent window is Invalid.

return FALSE;

}

RECT subWndRect, parentWndRect;

::GetClientRect(m_hwndParent, &parentWndRect);

if(::IsWindow(hwndChild))

{

::GetWindowRect(hwndChild, &subWndRect);

POINT pt;

pt.x = subWndRect.left; pt.y = subWndRect.top;

::ScreenToClient(m_hwndParent, &pt);

subWndRect.left = pt.x, subWndRect.top = pt.y;

pt.x = subWndRect.right; pt.y = subWndRect.bottom;

::ScreenToClient(m_hwndParent, &pt);

subWndRect.right = pt.x, subWndRect.bottom = pt.y;

RECT oriEDs;

oriEDs.left = subWndRect.left - parentWndRect.left;

oriEDs.right = parentWndRect.right - subWndRect.right;

oriEDs.top = subWndRect.top - parentWndRect.top;

oriEDs.bottom = parentWndRect.bottom - subWndRect.bottom;

m_alignset.push_back(AlignCfg(hwndChild, aligntype, oriEDs));

return true;

}

return FALSE;

}

void CAlignability::Align()

{

if(! ::IsWindow(m_hwndParent))

{

assert(0);//Can't AAlign: Parent window is Invalid.

return;

}

RECT rect;

::GetClientRect(m_hwndParent, &rect);

const int cxParent = rect.right - rect.left;

const int cyParent = rect.bottom - rect.top;

HWND hwndChild = 0;

for(long i=0, n=m_alignset.size(); i < n; ++i)

{

hwndChild = m_alignset[i].m_hwndChild;

if(::IsWindow(hwndChild) && ::IsChild(m_hwndParent, hwndChild))

{

::GetWindowRect(hwndChild, &rect);

POINT pt;

pt.x = rect.left; pt.y = rect.top;

::ScreenToClient(m_hwndParent, &pt);

rect.left = pt.x, rect.top = pt.y;

pt.x = rect.right; pt.y = rect.bottom;

::ScreenToClient(m_hwndParent, &pt);

rect.right = pt.x, rect.bottom = pt.y;

const int oriWidth = rect.right - rect.left;

const int oriHeight= rect.bottom - rect.top;

if(m_alignset[i].m_eType & leftalign)

{

rect.left = m_alignset[i].m_oriEDs.left;

if(!(m_alignset[i].m_eType & rightalign))

rect.right = rect.left + oriWidth; //保持宽度不变.

}

if(m_alignset[i].m_eType & topalign)

{

rect.top = m_alignset[i].m_oriEDs.top;

if(!(m_alignset[i].m_eType & bottomalign))

rect.bottom = rect.top + oriHeight; //保持高度不变.

}

if(m_alignset[i].m_eType & rightalign)

{

rect.right = cxParent - m_alignset[i].m_oriEDs.right;

if(!(m_alignset[i].m_eType & leftalign))

rect.left = rect.right - oriWidth; //保持宽度不变.

}

if(m_alignset[i].m_eType & bottomalign)

{

rect.bottom = cyParent - m_alignset[i].m_oriEDs.bottom;

if(!(m_alignset[i].m_eType & topalign))

rect.top = rect.bottom - oriHeight; //保持高度不变.

}

::MoveWindow(hwndChild, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);

}

else

{

assert(0); //SetAlign to a item failed.

}

}

}

HWND CAlignability::GetParentHwnd() const

{

return m_hwndParent;

}

BOOL CAlignability::SetParentHwnd(HWND hwndParent)

{

if(::IsWindow(hwndParent))

{

m_hwndParent == hwndParent;

return TRUE;

}

return FALSE;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有