关于SetCapture和GetCapture

正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口。如果调用了SetCapture,之后无论鼠标的位置在哪,鼠标消息都发给指定的这个窗口,直到调用ReleaseCapture或者调用SetCapture设置另一个窗口为止。
很多时候,窗口或控件在鼠标按下后,需要知道鼠标移动和放开的情况,例如按钮在鼠标按下后会变为“按下”状态,鼠标移出按钮区域时“弹起”,所以按钮控件需要在鼠标按下时SetCapture,鼠标放开后ReleaseCapture。
GetCapture只是检查一下当前是哪个窗口捕获了鼠标,通常不需要调用。

错误: _malloc 已经在 Libcmtd.lib 中定义, 引发的思考

错误: _malloc 已经在 Libcmtd.lib 中定义, 引发的思考:

C++编译器选项:/MT,/MTd,/Md,/MDd
必须让工程所使用的库都使用相同的配置,否则就会有相应的警告或错误提示,甚至出现无法解析的函数,
有时,我们使用的库不是自己可以控制的,那么就只能把工程属性设置成你使用库的选项相同,这样可以编译通过了.

VC++实现窗口抖动

VC++实现窗口抖动,代码如下

void Move()
{
	srand((unsigned)time(NULL));
	HWND hWnd = ::AfxGetMainWnd()->GetSafeHwnd();
	RECT rcOld, rcNew;
	::GetWindowRect(hWnd, &rcOld);
	::memcpy(&rcNew, &rcOld, sizeof(RECT));
	int iWidth = rcOld.right-rcOld.left;
	int iHeight = rcOld.bottom-rcOld.top;
	int x = 0, y = 0;
	for (int i =0; i<80; i++)
	{
		x = rand()%60-30;
		y = rand()%60-30;
		::MoveWindow(hWnd, rcNew.left+x, rcNew.top+y, iWidth, iHeight, TRUE);
	}
	::MoveWindow(hWnd, rcOld.left, rcOld.top, iWidth, iHeight, TRUE);
}

VC 使用命令行编译

VC 使用命令行编译,创建批处理命令如下:

@echo off

taskkill /f /im MyAssistant.exe
set path=D:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE;%Systemroot%;%systemroot%/system32;
set name=MyAssistant
set outname=MyAssistant.exe

devenv /Rebuild Release "MyAssistant.sln"  /project "MyAssistant.vcproj" /projectconfig Release
pause

VC 屏幕截图

VC++实现屏幕截图:

void CScreenDlg::OnPaint()
{
	CClientDC dc(this); 
	// 获取屏幕DC
	HDC hScrDC = ::GetDC(NULL);
	// 得到屏幕分辨率  
	INT nHeight = GetDeviceCaps(hScrDC, VERTRES);
	INT nWidth = GetDeviceCaps(hScrDC, HORZRES);  
	// 创建屏幕DC的兼容DC
	HDC hMemDC1 = CreateCompatibleDC(hScrDC);
	// 创建屏幕兼容位图
	HBITMAP hBitmap1 = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
	// 把兼容位图选入兼容DC
	HBITMAP hBitmap2 = (HBITMAP)SelectObject(hMemDC1, hBitmap1);
	// 复制DC
	BitBlt(hMemDC1, 0, 0, nWidth, nHeight, hScrDC, 0, 0, SRCCOPY);
	// 显示
	BitBlt(dc.GetSafeHdc(), 0, 0, nHeight, nWidth, hMemDC1, 0, 0, SRCCOPY);
	::DeleteObject(hBitmap1);
	::DeleteDC(hMemDC1);
	__super::OnPaint();
}

VC++托盘图标菜单弹出后,点击其它地方,菜单不消失的问题

遇到VC++托盘图标菜单弹出后,点击其它地方,菜单不消失的问题。

解决办法:在TrackPopupMenu函数前面添加SetForegroundWindow();即可解决.

示例代码:

POINT point;
HMENU hMenu, hSubMenu;
GetCursorPos(&point);
hMenu = LoadMenu(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MENU1));
hSubMenu = GetSubMenu(hMenu, 0);
SetMenuDefaultItem(hSubMenu, -1, FALSE);
SetForegroundWindow();	// 解决托盘图标菜单弹出后,点击其它地方,菜单不消失的问题
TrackPopupMenu(hSubMenu, TPM_BOTTOMALIGN, point.x, point.y, 0, m_hWnd, NULL);
PostMessage(WM_NULL, 0, 0);   
DestroyMenu(hMenu);