锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦ㄧ敤VC寮鍙戝簲鐢ㄧ▼搴忔椂錛岀粡甯鎬細瑕佸仛涓浜涘彲浠ユ敼鍙樺ぇ灝忕殑瀵硅瘽妗嗭紝鑰岃繖涓椂鍊欏氨瑕佹眰瀵硅瘽妗嗕笂鐨勬帶浠朵細闅忕潃瀵硅瘽妗嗗ぇ灝忕殑鏀瑰彉鑰屾敼鍙樿嚜宸辯殑浣嶇疆鍜屽ぇ灝忋傚鏋滄帶浠舵瘮杈冨皯錛岄偅鍙互鍦ㄥ璇濇鐨凮nSize()浜嬩歡閲岄潰娣誨姞浠g爜錛岄氳繃璁$畻鏉ヨ皟鏁村悇涓帶浠剁殑浣嶇疆鍜屽ぇ灝忥紱浣嗘槸錛屽鏋滃璇濇涓婄殑鎺т歡姣旇緝澶氱殑璇濓紝閭h繖灝嗘槸涓浠墮潪甯哥棝鑻︾殑浜嬫儏錛佽鏄▼搴忎腑鍙堟湁寰堝鍙互鏀瑰彉澶у皬鐨勫璇濇錛岄偅涓涓竴涓殑OnSize()鍐欎笅鏉ワ紝閭d細浣跨▼搴忓憳宕╂簝鐨勶紒 typedef struct _dlgControlTag 榪欓噷瑕佸緇撴瀯涓殑iFlag鍜宨Percent榪涜涓浜涜В閲娿傚叾涓璱Flag鏄笅闈㈢殑鏋氫婦鍊鹼細 enum iPercent琛ㄧず鏀瑰彉鍊煎崰瀵硅瘽妗嗘敼鍙樺肩殑鐧懼垎姣斻備緥濡傦紝涓涓帶浠剁殑iPercent鍊間負100錛宨Flag鍊間負MOVEX錛岄偅涔堝綋瀵硅瘽妗嗙殑瀹藉害鏀瑰彉100涓崟浣嶇殑鏃跺欙紝榪欎釜鎺т歡灝卞湪X鏂瑰悜縐誨姩100涓崟浣嶏紱鍙堝錛屼竴涓帶浠剁殑iPercent鍊間負100錛宨Flag鍊間負ELASTICXY錛岄偅涔堝綋瀵硅瘽妗嗙殑瀹藉害鍜岄珮搴﹀垎鍒敼鍙?00涓崟浣嶇殑鏃跺欙紝鎺т歡鐨勯珮搴﹀拰瀹藉害涔熺浉搴旂殑鏀瑰彉100涓崟浣嶃?br> 涓嬮潰鏄緗帶浠朵俊鎭殑鍑芥暟錛?/p>
BOOL SetControlProperty(PDLGCTLINFO lp, int nElements); 浣跨敤璧鋒潵闈炲父綆鍗曪紝鍦ㄥ璇濇鐨凮nInitDialog()鍑芥暟閲岄潰娣誨姞綾諱技涓嬮潰鐨勪唬鐮佸氨琛屼簡錛?/p>
// 鎺т歡淇℃伅鏁扮粍 // 璁劇疆鎺т歡淇℃伅 涓嬮潰灝辨槸浣跨敤涓婇潰榪欐浠g爜鐨勫璇濇鏀瑰彉澶у皬鍓嶅悗鐨勬晥鏋滃浘錛?/p>
瀵逛袱寮犳埅鍥劇殑姣旇緝鎴戜滑鍙互寰堝鏄撶殑鐞嗚В涓婇潰閭f浠g爜銆?br> 鎴戣繕鎻愪緵浜嗕竴涓嚱鏁幫細 void ShowSizeIcon(BOOL bShow = TRUE); 鏉ヨ緗槸鍚︽樉紺哄璇濇鍙充笅瑙掕〃紺哄彲浠ユ敼鍙樺ぇ灝忕殑鍥炬爣銆傝繖涓浘鏍囨槸浠庣郴緇熶腑璇誨彇鐨勶紝鎴戜笂闈㈢殑鎴浘鏄疻indows2000涓嬬殑錛屽湪WindowsXP涓氨浼氳嚜鍔ㄥ彉鎴怷P椋庢牸鐨勩?br> 濂戒簡錛岄棽璇濅笉澶氳浜嗭紝涓嬮潰璐村嚭璇ュ璇濇綾籆lxDialog鐨勬簮浠g爜錛岄噷闈㈡湁璇︾粏鐨勬敞閲婏細 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class ClxDialog : public CDialog typedef struct _dlgControlTag enum // 璁劇疆鎺т歡淇℃伅 // 鏄惁鍦ㄥ璇濇鍙充笅瑙掓樉紺鴻〃紺哄彲鏀瑰彉澶у皬鐨勫浘鏍?br> void ShowSizeIcon(BOOL bShow = TRUE); protected: private: lxDialog.cpp鏂囦歡: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" // 琛ㄧず鍙敼鍙樺ぇ灝忕殑鍥炬爣ID ClxDialog::ClxDialog(UINT nID, CWnd* pParent /*=NULL*/) BEGIN_MESSAGE_MAP(ClxDialog, CDialog) BOOL ClxDialog::OnInitDialog() // 璁劇疆瀵硅瘽妗嗕負鍙彉澶у皬鐨?br> ModifyStyle(0, WS_SIZEBOX); // 浠ュ璇濇鐨勫垵濮嬪ぇ灝忎綔涓哄璇濇鐨勫搴﹀拰楂樺害鐨勬渶灝忓?br> CRect rectDlg; // 寰楀埌瀵硅瘽妗哻lient鍖哄煙鐨勫ぇ灝?/font> // Load鍥炬爣 // 鍒涘緩鏄劇ず鍥炬爣鐨勯潤鎬佹帶浠跺茍鏀懼湪瀵硅瘽妗嗗彸涓嬭 // 鏄劇ず鍥炬爣 return TRUE; void ClxDialog::OnSize(UINT nType, int cx, int cy) // 鏈灝忓寲鏃跺閲忎負0 for (int i = 0; i < m_iControlNumber; i++) int iId = m_pControlArray[i].iId; // 鏃犳晥鍊?br> if ((iPercent < 0) || (iPercent > 100)) // 寰楀埌鎺т歡鎸囬拡 ScreenToClient(rectCtrl); int iLeft = rectCtrl.left; switch (iFlag) case MOVEY: // Y鏂瑰悜縐誨姩 case MOVEXY: // X鏂瑰悜鍜孻鏂瑰悜鍚屾椂縐誨姩 case ELASTICX: // X鏂瑰悜鏀瑰彉澶у皬 case ELASTICY: // Y鏂瑰悜鏀瑰彉澶у皬 case ELASTICXY: // X鏂瑰悜鍜孻鏂瑰悜鍚屾椂鏀瑰彉澶у皬 default: // 鎶婃帶浠剁Щ鍔ㄥ埌鏂頒綅緗?br> pWndCtrl->MoveWindow(iLeft, iTop, iWidth, iHeight); // 鎶婂浘鏍囩Щ鍔ㄥ埌瀵硅瘽妗嗗彸涓嬭 // 璁板綍瀵硅瘽妗哻lient鍖哄煙鐨勫ぇ灝?br> if (nType != SIZE_MINIMIZED) void ClxDialog::OnSizing(UINT nSide, LPRECT lpRect) // 瀵硅瘽妗嗕笉鑳藉皬浜庡垵濮嬪ぇ灝?/font> int iWidth = lpRect->right - lpRect->left; if (iWidth <= m_iMinWidth) BOOL ClxDialog::SetControlProperty(PDLGCTLINFO lp, int nElements) if (NULL == lp) if (nElements <= 0) m_pControlArray = lp; return TRUE; void ClxDialog::ShowSizeIcon(BOOL bShow /*=NULL*/)娣卞叆嫻呭嚭MFC鏂囨。/瑙嗗浘鏋舵瀯涔嬬浉浜掑叧緋?/h1>
銆銆鍦ㄥ熀浜?鏂囨。/瑙嗗浘"鏋舵瀯鐨凪FC紼嬪簭涓紝鐢ㄦ埛娑堟伅錛堥紶鏍囥侀敭鐩樿緭鍏ョ瓑錛変細鍏堝彂寰瑙嗗浘錛屽鏋滆鍥炬湭澶勭悊鍒欎細鍙戝線妗嗘灦紿楀彛銆傛墍浠ワ紝涓鑸潵璇達紝娑堟伅鏄犲皠瀹滃畾涔夊湪瑙嗗浘涓傚彟澶栵紝濡傛灉涓涓簲鐢ㄥ悓鏃舵嫢鏈夊涓鍥捐屽綋鍓嶆椿鍔ㄨ鍥炬病鏈夊娑堟伅榪涜澶勭悊鍒欐秷鎭篃浼氬彂寰妗嗘灦紿楀彛銆?br>
銆銆涓嬮潰鎴戜滑鏉ョ湅瀹炰緥錛屾垜浠埄鐢╒isual C++鍚戝鍒涘緩涓涓崟鏂囨。/瑙嗗浘鏋舵瀯鐨凪FC紼嬪簭錛屽湪鍏朵腑澧炲姞涓涓彍鍗曢」涓?鑷畾涔?錛圛D涓篒DM_SELF錛屽鍥?.4錛夈?br>
鍥?.4 鍚?鑷畾涔?鑿滃崟鐨勫崟鏂囨。/瑙嗗浘鏋舵瀯MFC紼嬪簭
銆銆鎴戜滑鍒嗗埆鍦ㄨ鍥劇被鍜屾鏋剁獥鍙g被涓負"鑷畾涔?鑿滃崟娣誨姞娑堟伅鏄犲皠錛屼唬鐮佸涓嬶細
//瑙嗗浘涓殑娑堟伅鏄犲皠鍜屽鐞嗗嚱鏁?br>BEGIN_MESSAGE_MAP(CExampleView, CView)
銆//{{AFX_MSG_MAP(CExampleView)
銆銆ON_COMMAND(IDM_SELF, OnSelf)
銆//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CExampleView::OnSelf()
{
銆// TODO: Add your command handler code here
銆AfxMessageBox("娑堟伅鍦ㄨ鍥句腑澶勭悊");
}
//妗嗘灦紿楀彛涓殑娑堟伅鏄犲皠鍜屽鐞嗗嚱鏁?br>BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
銆//{{AFX_MSG_MAP(CMainFrame)
銆銆ON_COMMAND(IDM_SELF, OnSelf)
銆//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMainFrame::OnSelf()
{
銆// TODO: Add your command handler code here
銆AfxMessageBox("娑堟伅鍦ㄦ鏋剁獥鍙d腑澶勭悊");
}
銆銆榪欐椂鍊欙紝鎴戜滑鍗曞嚮"鑷畾涔?鑿滃崟錛屽脊鍑哄璇濇鏄劇ず"娑堟伅鍦ㄨ鍥句腑澶勭悊"錛涘鏋滄垜浠垹闄ゆ鏋剁獥鍙d腑鐨勬秷鎭槧灝勶紝鍐嶅崟鍑?鑷畾涔?鑿滃崟錛屽脊鍑哄璇濇涔熸樉紺?娑堟伅鍦ㄨ鍥句腑澶勭悊"錛涗絾鏄紝鑻ユ垜浠皢瑙嗗浘涓殑娑堟伅鏄犲皠鍒犻櫎浜嗭紝灝變細鏄劇ず"娑堟伅鍦ㄦ鏋剁獥鍙d腑澶勭悊"錛佽繖楠岃瘉浜嗘垜浠叧浜庢秷鎭鐞嗛『搴忚榪扮殑姝g‘鎬с?br>
銆銆嬈叉繁鍏ョ悊瑙f秷鎭祦鍔ㄨ繃紼嬶紝榪橀渶璁ょ湡鍒嗘瀽CFrameWnd::OnCmdMsg銆丆View::OnCmdMsg鍑芥暟鐨勬簮浠g爜錛?br>
BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
銆// pump through current view FIRST
銆CView* pView = GetActiveView();
銆if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
銆銆return TRUE;
銆// then pump through frame
銆if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
銆銆return TRUE;
銆// last but not least, pump through app
銆CWinApp* pApp = AfxGetApp();
銆if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
銆銆return TRUE;
銆return FALSE;
}
BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
銆// first pump through pane
銆if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
銆銆return TRUE;
銆// then pump through document
銆BOOL bHandled = FALSE;
銆if (m_pDocument != NULL)
銆{
銆銆// special state for saving view before routing to document
銆銆_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
銆銆CView* pOldRoutingView = pThreadState->m_pRoutingView;
銆銆pThreadState->m_pRoutingView = this;
銆銆bHandled = m_pDocument->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
銆銆pThreadState->m_pRoutingView = pOldRoutingView;
銆}
銆return bHandled;
}
銆銆鍒嗘瀽涓婅堪婧愪唬鐮佸彲鐭ワ紝WM_COMMAND娑堟伅鐨勫疄闄呮祦鍔ㄩ『搴忔瘮鍓嶆枃鍙欒堪鐨?鍏堣鍥撅紝鍚庢鏋剁獥鍙?瑕佸鏉傚緱澶氾紝鏂囨。鍜屽簲鐢ㄧ▼搴忛兘鍙備笌浜嗘秷鎭殑澶勭悊榪囩▼銆傚鏋滄垜浠啀涓烘枃妗e拰搴旂敤娣誨姞娑堟伅鏄犲皠鍜屽鐞嗗嚱鏁幫細
//鏂囨。鐨勬秷鎭槧灝勫拰澶勭悊鍑芥暟
BEGIN_MESSAGE_MAP(CExampleDoc, CDocument)
銆//{{AFX_MSG_MAP(CExampleDoc)
銆銆ON_COMMAND(IDM_SELF, OnSelf)
銆//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CExampleDoc::OnSelf()
{
銆// TODO: Add your command handler code here
銆AfxMessageBox("娑堟伅鍦ㄦ枃妗d腑澶勭悊");
}
//搴旂敤鐨勬秷鎭槧灝勫拰澶勭悊鍑芥暟
BEGIN_MESSAGE_MAP(CExampleApp, CWinApp)
//{{AFX_MSG_MAP(CExampleApp)
ON_COMMAND(IDM_SELF, OnSelf)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CExampleApp::OnSelf()
{
銆// TODO: Add your command handler code here
銆AfxMessageBox("娑堟伅鍦ㄥ簲鐢ㄤ腑澶勭悊");
}
銆銆灞忚斀鎺夎鍥懼拰妗嗘灦紿楀彛鐨勬秷鎭槧灝勶紝鍐嶅崟鍑?鑷畾涔?鑿滃崟錛屽脊鍑哄璇濇鏄劇ず"娑堟伅鍦ㄦ枃妗d腑澶勭悊"錛涘啀灞忚斀鎺夋枃妗d腑鐨勬秷鎭槧灝勶紝寮瑰嚭瀵硅瘽妗嗘樉紺?娑堟伅鍦ㄥ簲鐢ㄤ腑澶勭悊"錛佺敱姝ゅ彲瑙侊紝瀹屾暣鐨刉M_COMMAND娑堟伅鐨勫鐞嗛『搴忔槸"瑙嗗浘鈥曗曟枃妗b曗曟鏋剁獥鍙b曗曞簲鐢?錛?br>
銆銆瀹為檯涓婏紝鍏充簬MFC鐨勬秷鎭祦鍔ㄦ槸涓涓緢澶嶆潅鐨勮棰橈紝闄蜂簬綃囧箙鐨勫師鍥狅紝鎴戜滑涓嶅彲鑳藉鍏惰繘琛屾洿璇﹀敖鐨勪粙緇嶏紝璇昏呭彲鑷瀵繪壘鐩稿叧璧勬枡銆?
]]>
涓轟簡瑙e喅榪欎釜闂錛屾垜鍐欎簡涓涓嚜鍔ㄦ敼鍙樻帶浠朵綅緗拰澶у皬鐨勫璇濇綾籆lxDialog銆備粠榪欎釜綾葷戶鎵跨殑瀵硅瘽妗嗙被錛屽彧瑕佸湪OnInitDialog()閲屽鎺т歡鍋氫竴浜涚畝鍗曠殑璁劇疆錛屽璇濇涓婄殑鎺т歡灝變細闅忕潃瀵硅瘽妗嗗ぇ灝忕殑鏀瑰彉鑰屾敼鍙樿嚜宸辯殑浣嶇疆鍜屽ぇ灝忋?br> 涓轟簡淇濆瓨鎺т歡淇℃伅錛屾垜瀹氫箟浜嗕竴涓粨鏋勶細
{
int iId; // 鎺т歡ID
int iFlag; // 鏍囧織錛岃〃紺烘庢牱鏀瑰彉鎺т歡鐨勪綅緗垨鑰呭ぇ灝?br> int iPercent; // 鏀瑰彉鍊煎崰瀵硅瘽妗嗘敼鍙樺肩殑鐧懼垎姣?br>} DLGCTLINFO, *PDLGCTLINFO;
{
MOVEX = 0, // 鎺т歡鍦╔鏂瑰悜錛堝乏鍙籌級縐誨姩
MOVEY, // 鎺т歡鍦╕鏂瑰悜錛堜笂涓嬶級縐誨姩
MOVEXY, // 鎺т歡鍦╔鏂瑰悜鍜孻鏂瑰悜鍚屾椂縐誨姩
ELASTICX, // 鎺т歡鍦╔鏂瑰悜錛堝搴︼級鏀瑰彉澶у皬
ELASTICY, // 鎺т歡鍦╕鏂瑰悜鏀癸紙楂樺害錛夋敼鍙樺ぇ灝?/font>
ELASTICXY // 鎺т歡鍦╔鏂瑰悜鍜孻鏂瑰悜鍚屾椂鏀瑰彉澶у皬
};
static DLGCTLINFO dcMenuGroup[] =
{
{IDOK, MOVEX, 100},
{IDCANCEL, MOVEX, 100},
{IDC_BUTTON1, MOVEX, 50},
{IDC_BUTTON1, MOVEY, 100},
{IDC_EDIT1, ELASTICX, 100},
{IDC_EDIT2, ELASTICX, 50},
{IDC_EDIT3, ELASTICX, 50},
{IDC_EDIT3, MOVEX, 50},
{IDC_EDIT4, ELASTICY, 100},
{IDC_EDIT5, ELASTICX, 100},
{IDC_EDIT5, ELASTICY, 50},
{IDC_EDIT6, ELASTICX, 100},
{IDC_EDIT6, ELASTICY, 50},
{IDC_EDIT6, MOVEY, 50},
};
SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));
lxDialog.h鏂囦歡錛?/p>
// 鑷姩鏀瑰彉鎺т歡浣嶇疆鍜屽ぇ灝忕殑瀵硅瘽妗嗙被
// 鏂囦歡鍚嶏細lxDialog.h
// 浣滆咃細StarLee( coolstarlee@sohu.com )
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{
public:
ClxDialog(UINT nID, CWnd* pParent = NULL);
{
int iId;
int iFlag;
int iPercent;
} DLGCTLINFO, *PDLGCTLINFO;
{
MOVEX = 0,
MOVEY,
MOVEXY,
ELASTICX,
ELASTICY,
ELASTICXY
};
BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);
virtual BOOL OnInitDialog();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
DECLARE_MESSAGE_MAP()
int m_iClientWidth; // 瀵硅瘽妗哻lient鍖哄煙鐨勫搴?br> int m_iClientHeight; // 瀵硅瘽妗哻lient鍖哄煙鐨勯珮搴?br> int m_iMinWidth; // 瀵硅瘽妗嗙殑鏈灝忓搴?br> int m_iMinHeight; // 瀵硅瘽妗嗙殑鏈灝忛珮搴?br> PDLGCTLINFO m_pControlArray; // 鎺т歡淇℃伅鏁扮粍鎸囬拡
int m_iControlNumber; // 璁劇疆鎺т歡淇℃伅鐨勬帶浠朵釜鏁?br> BOOL m_bShowSizeIcon; // 鏄惁鏄劇ず琛ㄧず鍙敼鍙樺ぇ灝忕殑鍥炬爣
CStatic m_wndSizeIcon; // 鏀懼浘鏍囩殑闈欐佹帶浠?br> // 淇濆瓨鍥炬爣鐨刡itmap
CBitmap m_bmpSizeIcon;
BITMAP m_bitmap;
};
// 鑷姩鏀瑰彉鎺т歡浣嶇疆鍜屽ぇ灝忕殑瀵硅瘽妗嗙被
// 鏂囦歡鍚嶏細lxDialog.cpp
// 浣滆咃細StarLee( coolstarlee@sohu.com )
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "lxDialog.h"
#ifndef OBM_SIZE
#define OBM_SIZE 32766
#endif
: CDialog(nID, pParent)
, m_iClientWidth(0)
, m_iClientHeight(0)
, m_iMinWidth(0)
, m_iMinHeight(0)
, m_pControlArray(NULL)
, m_iControlNumber(0)
, m_bShowSizeIcon(TRUE)
{}
ON_WM_SIZE()
ON_WM_SIZING()
END_MESSAGE_MAP()
{
CDialog::OnInitDialog();
GetWindowRect(rectDlg);
m_iMinWidth = rectDlg.Width();
m_iMinHeight = rectDlg.Height();
CRect rectClient;
GetClientRect(rectClient);
m_iClientWidth = rectClient.Width();
m_iClientHeight = rectClient.Height();
m_bmpSizeIcon.LoadOEMBitmap(OBM_SIZE);
m_bmpSizeIcon.GetBitmap(&m_bitmap);
m_wndSizeIcon.Create(NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight), this, 0);
m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);
m_wndSizeIcon.MoveWindow(m_iClientWidth - m_bitmap.bmWidth, m_iClientHeight - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);
m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);
}
{
CDialog::OnSize(nType, cx, cy);
// 瀵硅瘽妗嗗搴﹀拰楂樺害鐨勫閲?nbsp;
int iIncrementX = cx - m_iClientWidth;
int iIncrementY = cy - m_iClientHeight;
if (nType == SIZE_MINIMIZED)
{
iIncrementX = iIncrementY = 0;
}
{
CWnd *pWndCtrl = NULL;
int iFlag = m_pControlArray[i].iFlag;
int iPercent = m_pControlArray[i].iPercent;
continue;
pWndCtrl = GetDlgItem(iId);
if ((NULL != pWndCtrl) && IsWindow(pWndCtrl->GetSafeHwnd()))
{
CRect rectCtrl;
pWndCtrl->GetWindowRect(rectCtrl);
int iTop = rectCtrl.top;
int iWidth = rectCtrl.Width();
int iHeight = rectCtrl.Height();
{
case MOVEX: // X鏂瑰悜縐誨姩
iLeft += (iIncrementX * iPercent / 100);
break;
iTop += (iIncrementY * iPercent / 100);
break;
iLeft += (iIncrementX * iPercent / 100);
iTop += (iIncrementY * iPercent / 100);
break;
iWidth += (iIncrementX * iPercent / 100);
break;
iHeight += (iIncrementY * iPercent / 100);
break;
iWidth += (iIncrementX * iPercent / 100);
iHeight += (iIncrementY * iPercent / 100);
break;
;
}
}
}
if (IsWindow(m_wndSizeIcon.GetSafeHwnd()))
m_wndSizeIcon.MoveWindow(cx - m_bitmap.bmWidth, cy - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);
{
m_iClientWidth = cx;
m_iClientHeight = cy;
}
}
{
CDialog::OnSizing(nSide, lpRect);
int iHeight = lpRect->bottom - lpRect->top;
lpRect->right = lpRect->left + m_iMinWidth;
if(iHeight <= m_iMinHeight)
lpRect->bottom = lpRect->top + m_iMinHeight;
}
{
// 璁劇疆鎺т歡鏁扮粍淇℃伅
return FALSE;
return FALSE;
m_iControlNumber = nElements;
}
{
m_bShowSizeIcon = bShow;
}
]]>
涓嶈兘澶熻嚜鍔ㄥ垵濮嬪寲 褰撴垜絎竴嬈″皢Rich Edit鎺т歡鏀懼湪璧勬簮紿椾綋涓婄殑鏃跺欙紝鍙戠幇紼嬪簭鏍規湰灝變笉鑳借繍琛屻傚悗鏉ユ墠鎵懼埌鍘熷洜錛屽師鏉ich Edit 鎺т歡鏄疧le綾誨瀷鐨勬帶浠躲傚湪鍔犺澆Rich Edit 鎺т歡鐨勬椂鍊欙紝蹇呴』榪涜鍒濆鍖栥備唬鐮佸涓嬶細 ..... } 涓嶈兘澶熸帴鍙桾AB閿?/strong> 灝?RichEdit鎺т歡鏀懼埌璧勬簮紿椾綋涓婄殑鏃跺欙紝鍙戠幇瀹冪殑灞炴ч〉涓茍娌℃湁璁劇疆鎺ュ彈TAB閿殑璁劇疆錛屽鑷村綋鎶婄劍鐐規斁鍒癛ich Edit 鎺т歡涓婄殑鏃跺欙紝涓鎸塼ab閿紝鐒︾偣灝辯Щ鍔ㄥ埌涓嬩竴涓帶浠朵笂闈㈠幓浜嗐?br>鍏蜂綋瑙e喅鏂規硶灝辨槸閲嶈澆Rich Edit鎺т歡鐨凮nGetDlgCode錛?br>渚嬪瓙浠g爜錛?br>.h鏂囦歡錛?br>class CMyRichEdit : public CRichEditCtrl{ return DLGC_WANTTAB;
涓嶈兘澶熼氳繃灞炴ц緗嚜鍔ㄦ崲琛?/strong> 褰撴妸Rich Edit鎺т歡鏀懼埌璧勬簮紿椾綋涓婄殑鏃跺欙紝鍙戠幇鍦ㄥ畠鐨勫睘鎬х獥浣撲腑騫舵病鏈夎緗甊ich Edit鎺т歡鑷姩鎹㈣鐨勫睘鎬ц緗傝杈懼埌榪欎竴鐩殑錛屼緥瀛愪唬鐮佸涓嬶細 ............. } 涓嶈兘鏄劇ず鍥劇墖絳夊叾浠朞LE瀵硅薄 MFC鎻愪緵鐨凜RichEditCtrl娌℃湁鎻愪緵鐩存帴鏄劇ず鍥劇墖絳塐LE瀵硅薄鐨勫睘鎬ф垨鏂規硶璁劇疆錛屼絾鏄彁渚涗簡涓涓帴鍙?strong>SetOLECallback( IRichEditOleCallback* pCallback ); public: virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg); }
瀹為檯涓婏紝CRichEditCtrl鏈韓鏄敮鎸丆trl+C瀹炵幇鎷瘋礉鍔熻兘鐨勶紝浣嗘槸褰撴垜鍦–RichiEditCtrl鐨勭戶鎵跨被涓嬌鐢ㄤ簡IRichiEditCallback鎺ュ彛鍚庯紝瀹冨氨涓嶅湪鏀寔Ctrl+C瀹炵幇鎷瘋礉鍔熻兘浜嗐傛垜鎯抽棶棰樺氨鍑哄湪IRichEditCallback鎺ュ彛涓娿?br>浠旂粏鐪嬩簡涓閬嶅畠鐨勫府鍔╂枃妗o紝鎴戝彂鐜伴棶棰樺氨鍑哄湪GetClipboardData涓婏紝鎴戞病鏈夊湪瀹冪殑瀹炵幇鏂規硶涓啓浠g爜錛屽彧鏄繑鍥炰簡S_OK錛屽鏋滆澶勭悊Ctrl+C錛屽氨蹇呴』榪斿洖E_NOTIMPL銆?br> 闄勫綍
#if !defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)
#define AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // OleRichEditCtrl.h : header file // 錛僫 nclude < richole.h > /////////////////////////////////////////////////////////////////////////// // // COleRichEditCtrl window class COleRichEditCtrl : public CRichEditCtrl { // Construction public : COleRichEditCtrl(); virtual ~ COleRichEditCtrl(); long StreamInFromResource( int iRes, LPCTSTR sType); protected : static DWORD CALLBACK readFunction(DWORD dwCookie, LPBYTE lpBuf, // the buffer to fill LONG nCount, // number of bytes to read LONG * nRead); // number of bytes actually read interface IExRichEditOleCallback; // forward declaration (see below in this header file) IExRichEditOleCallback * m_pIRichEditOleCallback; BOOL m_bCallbackSet; interface IExRichEditOleCallback : public IRichEditOleCallback { public : IExRichEditOleCallback(); virtual ~ IExRichEditOleCallback(); int m_iNumStorages; IStorage * pStorage; DWORD m_dwRef; virtual HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE * lplpstg); virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); virtual HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo); virtual HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow); virtual HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp); virtual HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj); virtual HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict); virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); virtual HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj); virtual HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect); virtual HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu); }; public : // Overrides // ClassWizard generated virtual function overrides // {{AFX_VIRTUAL(COleRichEditCtrl) protected : virtual void PreSubclassWindow(); // }}AFX_VIRTUAL // Implementation public : // Generated message map functions protected : // {{AFX_MSG(COleRichEditCtrl) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // }}AFX_MSG afx_msg UINT OnGetDlgCode( ); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////////// // // {{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)
// OleRichEditCtrl.cpp : implementation file
// 錛僫 nclude " stdafx.h " 錛僫 nclude " OleRichEditCtrl.h " #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /////////////////////////////////////////////////////////////////////////// // // COleRichEditCtrl COleRichEditCtrl::COleRichEditCtrl() { m_bCallbackSet = FALSE; } COleRichEditCtrl:: ~ COleRichEditCtrl() { // IExRichEditOleCallback class is a reference-counted class // which deletes itself and for which delete should not be called // delete m_pIRichEditOleCallback; } BEGIN_MESSAGE_MAP(COleRichEditCtrl, CRichEditCtrl) // {{AFX_MSG_MAP(COleRichEditCtrl) ON_WM_CREATE() // }}AFX_MSG_MAP ON_WM_GETDLGCODE( ) END_MESSAGE_MAP() // int COleRichEditCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CRichEditCtrl::OnCreate(lpCreateStruct) == - 1 ) return - 1 ; // m_pIRichEditOleCallback should have been created in PreSubclassWindow ASSERT( m_pIRichEditOleCallback != NULL ); // set the IExRichEditOleCallback pointer if it wasn't set // successfully in PreSubclassWindow if ( ! m_bCallbackSet ) { SetOLECallback( m_pIRichEditOleCallback ); } return 0 ; } void COleRichEditCtrl::PreSubclassWindow() { // base class first CRichEditCtrl::PreSubclassWindow(); m_pIRichEditOleCallback = NULL; m_pIRichEditOleCallback = new IExRichEditOleCallback; ASSERT( m_pIRichEditOleCallback != NULL ); m_bCallbackSet = SetOLECallback( m_pIRichEditOleCallback ); } long COleRichEditCtrl::StreamInFromResource( int iRes, LPCTSTR sType) { HINSTANCE hInst = AfxGetInstanceHandle(); HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(iRes), sType); DWORD len = SizeofResource(hInst, hRsrc); BYTE * lpRsrc = (BYTE * )LoadResource(hInst, hRsrc); ASSERT(lpRsrc); CMemFile mfile; mfile.Attach(lpRsrc, len); EDITSTREAM es; es.pfnCallback = readFunction; es.dwError = 0 ; es.dwCookie = (DWORD) & mfile; return StreamIn( SF_RTF, es ); }
/* static */
DWORD CALLBACK COleRichEditCtrl::readFunction(DWORD dwCookie, LPBYTE lpBuf, // the buffer to fill LONG nCount, // number of bytes to read LONG * nRead) // number of bytes actually read { CFile * fp = (CFile * )dwCookie; * nRead = fp -> Read(lpBuf,nCount); return 0 ; } /////////////////////////////////////////////////////////////////////////// //
COleRichEditCtrl::IExRichEditOleCallback::IExRichEditOleCallback()
{ pStorage = NULL; m_iNumStorages = 0 ; m_dwRef = 0 ; // set up OLE storage HRESULT hResult = ::StgCreateDocfile(NULL, STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE /* | STGM_DELETEONRELEASE */ | STGM_CREATE , 0 , & pStorage ); if ( pStorage == NULL || hResult != S_OK ) { AfxThrowOleException( hResult ); } } COleRichEditCtrl::IExRichEditOleCallback:: ~ IExRichEditOleCallback() { }
HRESULT STDMETHODCALLTYPE
COleRichEditCtrl::IExRichEditOleCallback::GetNewStorage(LPSTORAGE * lplpstg) { m_iNumStorages ++ ; WCHAR tName[ 50 ]; swprintf(tName, L " REOLEStorage%d " , m_iNumStorages); HRESULT hResult = pStorage -> CreateStorage(tName, STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE , 0 , 0 , lplpstg ); if (hResult != S_OK ) { ::AfxThrowOleException( hResult ); } return hResult; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::QueryInterface(REFIID iid, void ** ppvObject) { HRESULT hr = S_OK; * ppvObject = NULL; if ( iid == IID_IUnknown || iid == IID_IRichEditOleCallback ) { * ppvObject = this ; AddRef(); hr = NOERROR; } else { hr = E_NOINTERFACE; } return hr; } ULONG STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::AddRef() { return ++ m_dwRef; }
ULONG STDMETHODCALLTYPE
COleRichEditCtrl::IExRichEditOleCallback::Release() { if ( -- m_dwRef == 0 ) { delete this ; return 0 ; } return m_dwRef; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR * lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::ShowContainerUI(BOOL fShow) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj) { return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect) { return S_OK; } HRESULT STDMETHODCALLTYPE COleRichEditCtrl::IExRichEditOleCallback::GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu) { return S_OK; } // TabRichEditCtrl 娑堟伅澶勭悊紼嬪簭 UINT COleRichEditCtrl::OnGetDlgCode( ){ return DLGC_WANTTAB; } |
錛?錛変嬌鐢ˋppWizard鍒涘緩涓涓柊鐨凪FC AppWizard(EXE)宸ョ▼錛屽懡鍚嶄負"office"
錛?錛夐夋嫨鍗曟枃妗h鍥?SDI)緇撴瀯錛屽湪絎?姝ヤ腑闇瑕侀変腑Container,浠ユ彁渚涘鍣ㄦ敮鎸?騫朵笖閫変腑active document container 鍏跺畠閮戒負榛樿
錛?錛夊湪View鑿滃崟涓紝閫塁lassWizard,閫堿utomation閫夐」鍗?閫堿dd Class,閫夋嫨From a TypeLibrary, 鍦∣ffice鐩綍涓変腑Microsoft Word 97/2000 綾誨瀷搴揥ord8.olb鎴朩ord9.olb錛岄変腑application,document,_document銆傚崟鍑籵k
(4)緇機OfficeCntrItem娣誨姞涓鏂規硶銆侴etIDispatch()
鍏舵簮鐮佸涓嬶細
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPUNKNOWN lpUnk = m_lpObject;
Run();
LPOLELINK lpOleLink = NULL;
if (m_lpObject->QueryInterface(IID_IOleLink, (LPVOID FAR*)&lpOleLink) == NOERROR)
{
ASSERT(lpOleLink != NULL);
lpUnk = NULL;
if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
{
TRACE0("Warning: Link is not connected!\n");
lpOleLink->Release();
return NULL;
}
ASSERT(lpUnk != NULL);
}
LPDISPATCH lpDispatch = NULL;
if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)!=NOERROR)
{
TRACE0("Warning: does not support IDispatch!\n");
return NULL;
}
ASSERT(lpDispatch != NULL);
return lpDispatch;
錛?錛夈傚湪officeView.h娣誨姞#include "msword8.h"
錛?錛夈備慨鏀箆oid COfficeView::OnInsertObject()錛屾簮鐮佸涓嬶細
BeginWaitCursor();
COfficeCntrItem* pItem = NULL;
TRY
{
// Create new item connected to this document.
COfficeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new COfficeCntrItem(pDoc);
ASSERT_VALID(pItem);
// Initialize the item from the dialog data.
/* if (!dlg.CreateItem(pItem))
AfxThrowMemoryException(); // any exception will do
ASSERT_VALID(pItem);*/
CLSID clsid; //
if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))
AfxThrowMemoryException();
if(!pItem->CreateNewItem(clsid))
/*if(!pItem->CreateFromFile (filename,clsid)) */
AfxThrowMemoryException();
ASSERT_VALID(pItem);
pItem->Activate (OLEIVERB_SHOW,this);
ASSERT_VALID(pItem);
m_pSelection = pItem; // set selection to last inserted item
pDoc->UpdateAllViews(NULL);
// As an arbitrary user interface design, this sets the selection
// to the last item inserted.
// TODO: reimplement selection as appropriate for your application
m_pSelection = pItem; // set selection to last inserted item
pDoc->UpdateAllViews(NULL);
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
錛?錛夐噸杞絀D鈥擣ILE鈥擲AVE錛?/p>
void COfficeView::OnFileSave()
{
// TODO: Add your command handler code here
TRY{
LPDISPATCH lpDisp;
lpDisp = m_pSelection->GetIDispatch();
Documents docs;
_Application app;
_Document mydoc;
Documents my;
mydoc.AttachDispatch (lpDisp,TRUE);
app=mydoc.GetApplication ();
/* app.Run ("Macro3");*/
mydoc.Activate ();
BOOL password=mydoc.GetHasPassword ();
mydoc.SetPassword ("love");
password=mydoc.GetHasPassword ();
COleVariant vFalse((short)FALSE);
mydoc.SaveAs (COleVariant("c:\\love.doc"),vFalse,vFalse, COleVariant(""),vFalse,
COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);
}
CATCH(CException, e)
{
}
END_CATCH
}
bulid,click insert object,and edit ,and save.maybe run macro.