大概的思路是这样的:首先1.找到游戏窗口->
2.解析方块的位置、图案->
3.遍历方块,找到可以消去的方块->
4.计算方块在窗口中的位置,模拟鼠标点击。
大家都知道连连看的规则是:如果两个方块的连线小于等于两个直角时,这对方块就可以消去。所以除了两个方块之间用直线连接外,还有另外这两种情况。
1.一个直角
![连连看示意图-1](https://p-blog.csdn.net/images/p_blog_csdn_net/Albert_1030/LLK_3.JPG)
2.两个直角
![连连看示意图-2](https://p-blog.csdn.net/images/p_blog_csdn_net/Albert_1030/LLK_4.JPG)
根据上述情况,就可以归纳出一种统一的算法。即:首先找出图案相同的两个方块,分别向他们的四个方向引出四条线段,线段的另一端终止于边缘,或者其它的方块处。分别判断水平与水平、竖直与竖直方向的线段的横坐标、纵坐标是否有交集。如果没有两个方向都没有交集,则这两个方块不能消去。如果有,再在任一条线段有交集的位置向另一条线段连线,如果连线成功(中间无无方块阻碍或者两线段相连),则两方块可以消去。
至于方块图案的判断,是因为背景的图案颜色非常靠近(现在“角色版”索性为单色背景),分别取最亮处,与最暗处的RGB值。找出R,G,B值的最大、最小值。判断的时候是在方块上取出任意几个点的(程序中为4个点)RGB值,如果这四个点的R,G,B值都在背景色R,G,B的最大、最小值的范围内,则断定这个方格上没有方块。
其中比较重要的两个技巧就是这样。我把主要的代码贴出来:
class
CLLKer
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public:
CLLKer();
virtual ~CLLKer();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 设置窗口标题
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
void SetWndCaption(CString strCaption)...{ m_strWndCaption = strCaption; }
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 设置方块个数
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
void SetCellCount(UINT nHorCount, UINT nVerCount) ...{
m_nHorCellCount = nHorCount;
m_nVerCellCount = nVerCount;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 设置单元格大小
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
void SetCellSize(UINT nWidth, UINT nHeight) ...{
m_nCellWidth = nWidth;
m_nCellHeight = nHeight;
}
// 设置边界
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
void SetMagin(UINT nLeft, UINT nTop) ...{
m_nMargin_X = nLeft;
m_nMargin_Y = nTop;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**/
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BOOL LockWnd(); // 锁定窗口
UINT Encode(); // 扫描窗口记录布局信息
BOOL EliminateOnePair();
void EliminateAll();
BOOL CheckWnd();
void Reset();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private:
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**///
// 功能函数
int CompareTowColor(COLORREF cColor1, COLORREF cColor2); // 返回两颜色的RGB的差值和
int SearchColor(COLORS color); // 取得颜色相同的Cell索引值
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void FindXLine(const POS& pos, int& iLeft, int& iRight); // 取得水平方向的路径
void FindYLine(const POS& pos, int& iTop, int& iLow); // 取得竖直方向的路径
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BOOL IsXPath(const POS& pos1, const POS& pos2); // 水平方向的路径是否相通
BOOL IsYPath(const POS& pos1, const POS& pos2); // 竖直方向的路径是否相通
BOOL IsPath(const POS& pos1, const POS& pos2); // 判断两单元格是否存在连通路径
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BOOL FindMatchingCell(const POS& pos, POS& posMathed); // 找到指定方块的匹配方块
BOOL FindPair(POS& posOri, POS& posMathed); // 找到一对可消除的方块
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
void ReleaseData();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**///
// 中间变量
int **m_pMap; // 单元格布局
CWnd *m_pWnd; // 游戏窗口
vector<CELL> m_vCells; // 单元格信息
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**///
// 参数
CString m_strWndCaption;
UINT m_nHorCellCount;
UINT m_nVerCellCount;
UINT m_nCellWidth;
UINT m_nCellHeight;
UINT m_nMargin_X;
UINT m_nMargin_Y;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
UINT m_nMax_R;
UINT m_nMax_G;
UINT m_nMax_B;
UINT m_nMin_R;
UINT m_nMin_G;
UINT m_nMin_B;
}
;
class
CAboutDlg :
public
CDialog
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
public:
CAboutDlg();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Dialog Data
//{{AFX_DATA(CAboutDlg)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
enum ...{ IDD = IDD_ABOUTBOX };
//}}AFX_DATA
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CAboutDlg::DoDataExchange(CDataExchange
*
pDX)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//
{{AFX_MSG_MAP(CAboutDlg)
//
No message handlers
//
}}AFX_MSG_MAP
END_MESSAGE_MAP()
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CLLKDlg dialog
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
CLLKDlg::CLLKDlg(CWnd
*
pParent
/**/
/*=NULL*/
)
: CDialog(CLLKDlg::IDD, pParent)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//{{AFX_DATA_INIT(CLLKDlg)
m_bAutoElmit = FALSE;
m_bIsTopMost = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_bStarted = FALSE;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::DoDataExchange(CDataExchange
*
pDX)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLLKDlg)
DDX_Check(pDX, IDC_CHK_AUTO, m_bAutoElmit);
DDX_Check(pDX, IDC_CHK_TOPMOST, m_bIsTopMost);
//}}AFX_DATA_MAP
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BEGIN_MESSAGE_MAP(CLLKDlg, CDialog)
//
{{AFX_MSG_MAP(CLLKDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_LOCK, OnLock)
ON_BN_CLICKED(IDC_ENCODE, OnEncode)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CHK_TOPMOST, OnChkTopmost)
//
}}AFX_MSG_MAP
END_MESSAGE_MAP()
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/////
//
CLLKDlg message handlers
BOOL CLLKDlg::OnInitDialog()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CDialog::OnInitDialog();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Add "About..." menu item to system menu.
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**/////
// 取得配置文件路径
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
char szModulPath[_MAX_PATH] = ...{0};
GetModuleFileName(NULL, szModulPath, _MAX_PATH);
CString strPath = szModulPath;
int iPos = strPath.ReverseFind('/');
m_strInitPath = strPath.Left(iPos+1);
m_strInitPath += "CONFIG.INI";
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**/////
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CRect rcWnd;
GetWindowRect(rcWnd);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
int iPos_X = GetPrivateProfileInt("OPTION", "POS_X", 500, m_strInitPath);
int iPos_Y = GetPrivateProfileInt("OPTION", "POS_Y", 700, m_strInitPath);
rcWnd.OffsetRect(iPos_X, iPos_Y);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
MoveWindow(rcWnd, FALSE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BOOL m_bIsTopMost = GetPrivateProfileInt("OPTION", "TOPMOST", 0, m_strInitPath);
CheckDlgButton(IDC_CHK_TOPMOST, m_bIsTopMost);
HWND hWnd = this->GetSafeHwnd();
if ( m_bIsTopMost )
::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
else
::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SetTimer(1, 100, NULL);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return TRUE; // return TRUE unless you set the focus to a control
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnSysCommand(UINT nID, LPARAM lParam)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CDialog::OnSysCommand(nID, lParam);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
If you add a minimize button to your dialog, you will need the code below
//
to draw the icon. For MFC applications using the document/view model,
//
this is automatically done for you by the framework.
void
CLLKDlg::OnPaint()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (IsIconic())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CPaintDC dc(this); // device context for painting
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CDialog::OnPaint();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
The system calls this to obtain the cursor to display while the user drags
//
the minimized window.
HCURSOR CLLKDlg::OnQueryDragIcon()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
return (HCURSOR) m_hIcon;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnLock()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your control notification handler code here
if ( m_LLKer.LockWnd() )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
AfxMessageBox("锁定成功", MB_ICONINFORMATION);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_bStarted = TRUE;
return;
}
AfxMessageBox("未找到游戏窗口,请确认窗口名称是否正确", MB_ICONERROR);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnEncode()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your control notification handler code here
UINT nBlock = m_LLKer.Encode();
if ( nBlock > 0 )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
AfxMessageBox("解析成功!", MB_ICONINFORMATION);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnDelete()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
POINT ptCursor;
int iRes = ::GetCursorPos(&ptCursor);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if ( m_bAutoElmit )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_LLKer.EliminateAll();
::SetCursorPos(ptCursor.x, ptCursor.y);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if ( m_LLKer.EliminateOnePair() )
::SetCursorPos(ptCursor.x, ptCursor.y);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnTimer(UINT nIDEvent)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your message handler code here and/or call default
if ( !m_LLKer.CheckWnd() && m_bStarted )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_LLKer.Reset();
}
CDialog::OnTimer(nIDEvent);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CLLKDlg::OnChkTopmost()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
HWND hWnd = this->GetSafeHwnd();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if ( m_bIsTopMost )
::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
else
::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CString strBuf;
strBuf.Format("%d", m_bIsTopMost);
WritePrivateProfileString("OPTION", "TOPMOST", strBuf, m_strInitPath);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CLLKDlg::DestroyWindow()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// TODO: Add your specialized code here and/or call the base class
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
CRect rcWnd;
GetWindowRect(rcWnd);
CString strBuf;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
strBuf.Format("%d", rcWnd.left);
WritePrivateProfileString("OPTION", "POS_X", strBuf, m_strInitPath);
strBuf.Format("%d", rcWnd.top);
WritePrivateProfileString("OPTION", "POS_Y", strBuf, m_strInitPath);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return CDialog::DestroyWindow();
}