关闭

CFormView随着窗口的变化,Control及OLE控件自动居中窗体

标签: nulldialogstructfileinclude扩展
475人阅读 评论(0) 收藏 举报

CFormView随着窗口的变化,Control及OLE控件自动调整位自动居中

//网上也没有找到,通过自己努力看原代码,本问题已经解决。现贡献自己的一点力量,有不宜之处,望凉解;


//问题主要在于OLE控件,需要使用CWnd类中的m_pControlCont成员。
//贴上以下代码:

//头文件

#if !defined(AFX_DIALOGCONTROLINFO_H__90A78D21_17B4_4E64_8406_54E6F275A50D__INCLUDED_)
#define AFX_DIALOGCONTROLINFO_H__90A78D21_17B4_4E64_8406_54E6F275A50D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h" // main symbols

//*****************************************************************************************//
//
// 操作说明:
// 主要用于CFormView类,让窗体控件能随窗口的变化而始终居中。定义了一个全局变量
// g_CControlInfo(CControlInfo类).
// 在CFormView派生类的OnInitialUpdate()中调用全局函数GetWindowControlInfo,然后
// 在函数OnSize中调用全局函数CenterWindowChildControl()。
//
//*****************************************************************************************//


//全局函数定义
//*****************************************************************************************//
//
// 范围:适用于CFormView和对话框
// 函数功能:获取对话框信息所有控件;
// 参数:pParentWnd为对话框窗口指针;nDialogID为对话框模板; pCtrlCont为CWnd::m_pCtrlCont变量
// 调用:OnInitialUpdate();
//
//*****************************************************************************************//

void GetWindowControlInfo(CWnd *pParentWnd,UINT nDialogID,COleControlContainer *pCtrlCont);

//*****************************************************************************************//
//
// 范围:适用于CFormView和对话框
// 函数功能:让控件随父窗口移动而居中,适应相应要求;
// 参数: bHorz,bVert为控件居中方向,具有选择性;
// 调用: 窗动窗口在OnSize()中调用
//
//*****************************************************************************************//

void CenterWindowChildControl(BOOL bHorz,BOOL bVert);

//*****************************************************************************************//

//扩展对话框模板结构
typedef struct { 
  WORD dlgVer; 
  WORD signature; 
  DWORD helpID; 
  DWORD exStyle; 
  DWORD style; 
  WORD cDlgItems; 
  short x; 
  short y; 
  short cx; 
  short cy;  
} DLGTEMPLATEEX; 


//对话框子窗体信息结构

struct CONTROLINFOS
{
HWND hWndChild; //子控件窗体句柄
int x; //起点X坐标
int y; //起点Y坐标
int cx; //控件宽
int cy; //控件高
UINT ControlID; //控件ID
  CONTROLINFOS *next; //下一个控件

};

//实现子窗体控件相关操作类
class CControlInfo 
{
//construct
public:
CControlInfo();
~CControlInfo();

//Implement functions
public:
void GetAllChildWindow(CWnd *pParentWnd,UINT nDialogID);
BOOL AddControlInfo(HWND hwnd);
CONTROLINFOS* GetControlInfo(HWND hwnd);
void DisplayControlInfo();
  void GetDialogTemplateRawSize();

//member variable
public:
CONTROLINFOS *front,*rear; //链表头尾结点
CWnd *m_pParentWnd; //父窗口指针
CSize m_DialogRawSize; //模板对话框初始大小
UINT m_nDialogID; //对话框模板ID
COleControlContainer *m_pControlCont; //控件包容器
   

};



#endif

 

//源文件
#include "stdafx.h"
#include "ResizeDialogControl.h"
#include <..\src\occimpl.h> //COleControlContainer定义于该文件

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



//定义全局变量、函数
 
CControlInfo g_ControlInfo;

//实现
CControlInfo::CControlInfo()
{
m_pParentWnd=NULL;
front=rear=NULL;
m_DialogRawSize.cx=0;
m_DialogRawSize.cy=0;
m_nDialogID=0;
m_pControlCont=NULL;
}
///////////////////////////////////////////////////////////////////////////////////
CControlInfo::~CControlInfo()
{

CONTROLINFOS *pTemp=front;
while(pTemp)
{
front=pTemp->next;
delete pTemp;
pTemp=front;
}

}
/////////////////////////////////////////////////////////////////////////////////////
void CControlInfo::GetDialogTemplateRawSize()
{
if(m_nDialogID==0)
return;
//加载资源
LPCDLGTEMPLATE lpDialogTemplate=NULL;
HGLOBAL hDialogTemplate=NULL;
HINSTANCE hInst=AfxFindResourceHandle(MAKEINTRESOURCE(m_nDialogID),RT_DIALOG);
HRSRC hResource=::FindResource(hInst,MAKEINTRESOURCE(m_nDialogID),RT_DIALOG);
hDialogTemplate=LoadResource(hInst,hResource);

if(hDialogTemplate!=NULL)
{

lpDialogTemplate=(LPCDLGTEMPLATE)LockResource(hDialogTemplate);
if(((DLGTEMPLATEEX*)lpDialogTemplate)->signature==0xffff) //是否为扩展对话框
{
m_DialogRawSize.cx=((DLGTEMPLATEEX*)lpDialogTemplate)->cx;
  m_DialogRawSize.cy=((DLGTEMPLATEEX*)lpDialogTemplate)->cy;

}
else
{
m_DialogRawSize.cx=lpDialogTemplate->cx;
m_DialogRawSize.cy=lpDialogTemplate->cy;

}
UnlockResource(hDialogTemplate);
}
FreeResource(hDialogTemplate);


}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void CControlInfo::GetAllChildWindow(CWnd *pParentWnd,UINT nDialogID)
{

  if(!pParentWnd||nDialogID==0)
return;
m_pParentWnd=pParentWnd;
m_nDialogID=nDialogID;
CWnd *pChildWnd=pParentWnd->GetWindow(GW_CHILD);
  while(pChildWnd)
{
//添加子控件
AddControlInfo(pChildWnd->m_hWnd);
  pChildWnd=pChildWnd->GetWindow(GW_HWNDNEXT);
}


}
///////////////////////////////////////////////////////////////////////////////////////////
BOOL CControlInfo::AddControlInfo(HWND hwnd)
{

if(hwnd==NULL)
return FALSE;
CONTROLINFOS *pNew=new CONTROLINFOS;
pNew->hWndChild=hwnd;
CRect rect;
::GetWindowRect(hwnd,&rect); //屏幕坐标

CPoint point(rect.TopLeft());
::ScreenToClient(::GetParent(hwnd),&point); //转换为父窗的客户坐标

pNew->x=point.x;
pNew->y=point.y;

pNew->cx=rect.Width();
pNew->cy=rect.Height();
pNew->ControlID=::GetDlgCtrlID(hwnd);
pNew->next=NULL;
   
if(front==NULL) //第一个结点
{
front=pNew;
rear=pNew;
}
else
{
rear->next=pNew;
rear=pNew;
}

return TRUE;
}

/////////////////////////////////////////////////////////////////////////////////////////////////
CONTROLINFOS* CControlInfo::GetControlInfo(HWND hwnd)
{
CONTROLINFOS *pTemp=NULL;
if(hwnd==NULL||front==NULL)
return pTemp;

pTemp=front;
while(pTemp)
{
if(pTemp->hWndChild==hwnd)
return pTemp;
pTemp=pTemp->next;
}

return pTemp; //没有找到相应控件
}

///////////////////////////////////////////////////////////////////////////////////////////////////
void CControlInfo::DisplayControlInfo()
{
CONTROLINFOS *pTemp=front;
TCHAR str[100];
while(pTemp)
{
::GetWindowText(pTemp->hWndChild,str,100);
::MessageBox(NULL,str,"",MB_OK);
pTemp=pTemp->next;
}
}


//*****************************************************************************//
//
// 范围:适用于CFormView和对话框
// 函数功能:获取对话框信息所有控件;
// 参数:pParentWnd为对话框窗口指针,nDialogID:对话框ID;
// 调用:OnInitialUpdate();
//
//******************************************************************************//

void GetWindowControlInfo(CWnd *pParentWnd,UINT nDialogID,COleControlContainer *pCtrlCont)
{
  if(!pParentWnd)
return;
  g_ControlInfo.GetAllChildWindow(pParentWnd,nDialogID);
  g_ControlInfo.m_pControlCont=pCtrlCont;
   
  //获取对话框原始尺寸
  g_ControlInfo.GetDialogTemplateRawSize();
   

}

//*****************************************************************************//
//
// 范围:适用于CFormView和对话框
// 函数功能:让控件随父窗口移动而居中,适应相应要求;
// 参数: bHorz,bVert为控件居中方向,具有选择性;
// 调用: 窗动窗口在OnSize()中调用
//
//******************************************************************************//

void CenterWindowChildControl(BOOL bHorz,BOOL bVert)
{
//获取视窗尺寸,客户坐标;
   
if(!g_ControlInfo.m_pParentWnd)
return;
HWND hwnd=g_ControlInfo.m_pParentWnd->m_hWnd;
CRect ViewRect;
::GetClientRect(hwnd,&ViewRect);

   
//获对话框基本单位
//int h=HIWORD(GetDialogBaseUnits());
//int w=LOWORD(GetDialogBaseUnits());

CRect rect(0,0,g_ControlInfo.m_DialogRawSize.cx,g_ControlInfo.m_DialogRawSize.cy);
MapDialogRect(hwnd,&rect); //对话框单位转换为像素

//相差单位;客户坐标
int x=ViewRect.Width()-rect.Width();
int y=ViewRect.Height()-rect.Height();

  if(bHorz)
{
x=x>0?x/2:0;
}
if(bVert)
{
y=y>0?y/2:0;
}



CONTROLINFOS *pTemp=g_ControlInfo.front;
while(pTemp)
{
//重置子控体
//::SetWindowPos(pTemp->hWndChild,NULL,pTemp->x+x,pTemp->y,pTemp->cx,pTemp->cy,SWP_NOZORDER);
::MoveWindow(pTemp->hWndChild,pTemp->x+x,pTemp->y+y,pTemp->cx,pTemp->cy,TRUE);
pTemp=pTemp->next;
}

  if(g_ControlInfo.m_pControlCont!=NULL)
  {
  //m_pCtrlCont->ScrollChildren(x,y);
HWND hWnd;
COleControlSite *pSite;
POSITION pos=g_ControlInfo.m_pControlCont->m_siteMap.GetStartPosition();
while(pos!=NULL)
{
 
g_ControlInfo.m_pControlCont->m_siteMap.GetNextAssoc(pos,(void* &)hWnd,(void* &)pSite); //获取嵌入对象站点

pTemp=g_ControlInfo.GetControlInfo(pSite->m_hWnd); //查找保存的嵌入对象

if(pTemp)
{
ASSERT(pSite->m_pInPlaceObject!=NULL);
ASSERT(pSite->m_pObject!=NULL);

pSite->m_rect.SetRect(pTemp->x+x,pTemp->y+y,pTemp->x+x+pTemp->cx,pTemp->y+y+pTemp->cy); //改变位置  
pSite->m_pInPlaceObject->SetObjectRects(pSite->m_rect,pSite->m_rect); //改变嵌入对象位置  
}
}
 
  }

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5952次
    • 积分:98
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条