16,472
社区成员
发帖
与我相关
我的任务
分享
// 解决思路与5楼的相似。
// 生成一个简单的对话框应用程序,然后加入以下事件代码,供测试、参考:
// 如果没有图片,可另加一个测试的编辑框到对话框上,当作白色块。
void CTest2Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HDC hDC(::GetDC(m_hWnd)); CRect rectClient, rectBox; int x, y, i, j; COLORREF cref(RGB(255, 255, 255));
GetClientRect(&rectClient); rectBox.left = -1; // 设置未找到白色块的标志。
// 下面在对话框的整个客户区(从上往下)搜索白色块。如果有多个符合条件的白色块,则找到的将是最上面的一个白色块。
// 实际测试时,如果白色块在对话框上端,则很快找到,若在下端,则有延迟,因为要比较的像素点很多。
// 先找白色块的左上角。
for (y=0; y<rectClient.bottom; y++) {
for (x=0; x<rectClient.right; x++) { // ::SetPixel(hDC, x, y, RGB(255, 0, 0));
if (::GetPixel(hDC, x, y) == cref) {
for (i=1; i<10; i++) { // 为准确起见,必须至少找到10乘10个连续的白色点,才认为是找到了白色块。
for (j=1; j<10; j++) {
if (::GetPixel(hDC, x+i, y+j) != cref) goto FindLeft; // 找不到,就跳到FindLeft继续找。
}
}
FindLeft:
if (i == 10 && j == 10) {
rectBox.left = x; rectBox.top = y; goto FindRight; // 找到后,记录左上角坐标,然后跳出循环。
}
}
}
}
FindRight: // 找白色块的右边界。
if (rectBox.left < 0) goto Exit; // 若执行上面代码找不到白色块,则跳过以下代码,到Exit。
while (x<rectClient.right && ::GetPixel(hDC, ++x, y) == cref) ;
// 往下找白色块的右下角。
--x; while (y<rectClient.bottom && ::GetPixel(hDC, x, ++y) == cref) ;
rectBox.right = x; rectBox.bottom = --y; // 记录右下角坐标。
Exit:
if (rectBox.left >= 0) {
rectBox.InflateRect(5, 5); // 找到白色块后,可以适当放大矩形,使得能完全覆盖白色块。
// btn1.MoveWindow(&rectBox);
edit2.MoveWindow(&rectBox); // edit2是要移动的编辑框的控件变量。
}
::ReleaseDC(m_hWnd, hDC);
CDialog::OnLButtonDblClk(nFlags, point);
}