VC++开发技术总结

VC开发技术总结
在这里插入图片描述

1.内存分配和申请
GlobalAlloc,GlobalLock,GlobalUnLock
GMEM_FIXED 分配一个固定内存块
GMEM_MOVEABLE 分配一个可移动内存块
GMEM_DISCARDABLE 分配一个可丢弃内存块
GMEM_NOCOMPACT 堆在这个函数调用期间不进行累积
GMEM_NODISCARD 函数调用期间不丢弃任何内存块
GMEM_ZEROINIT 新分配的内存块全部初始化成零
2.数据类型转换
(1)CString和LPCTSTR之间的转换
CString转LPCTSTR:
CString str;

LPCTSTR lpData = str.GetBuffer();
str = lpData;

(2)CString和LPCTSTR之间的转换

3.CDialogEx::OnPaint()问题
正常情况下,CDialogEx::OnPaint()执行没有问题;
当对DC操作有误时,CDialogEx::OnPaint()执行会报错,这时需要屏蔽不执行,否则会引起winhand.cpp line 20 Assert错误。
4.Message问题
(1)清除消息队列:
连续打开2个对话窗,则中间需要清除消息队列,否则可能出现问题:
MSG msg;
while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
};
(2)WM_PAINT不能被REMOVE,需要Dispatch:
if (msg.message=WM_PAINT)
::DispatchMessage(&msg);
(3)PeekMessage
SetMessageQueue
DispatchMessage
TranslateMessage
GetMessage
PostMessage
PostThreadMessage
PostQuitMessage
SendMessage
SendDlgItemMessage
SendMessageTimeout
SendNotifyMessage
SendMessageCallback
BroadcastSystemMessage
BroadcastSystemMessageEx
GetQueueStatus
InSendMessage
ReplyMessage
5.OCX组件问题
1)注册问题
在WIN10下,批处理文件a.bat以管理员身份运行:
g:
cd\work\MFCActiveXControl2\Debug
regsvr32 /u MFCActiveXControl2.ocx
regsvr32 MFCActiveXControl2.ocx
cmd
6.ReleaseDC()和DeleteDC()问题
GetDC()必须与ReleaseDC()对应,也不能调用DeleteDC(),否则内存出现泄漏。
CreateDC()必须调用DeleteDC()
7.HBITMAP、CBitmap、BITMAP三者之间的关系
HBITMAP是图片句柄,类CBitmap对HBITMAP进行了封装,BITMAP是一个结构体,定义位图的
HBITMAP是图片句柄,类CBitmap对HBITMAP进行了封装,BITMAP是一个结构体,定义位图的信息(如宽度和高度等)。
CBitmap::Attach(),将HBITMAP转换成CBitmap。
CBitmap::GetBitmap(),将位图信息保存在BITMAP 结构中。
CBitmap::GetObject(),从HBITMAP句柄中获取BITMAP结构。
BitBlt()将内存DC中的内容按1:1复制到当前DC中。
StretchBlt()对图像进行伸缩变换后,将内存DC中的内容复制到当前DC中。
8.CDC 和 HDC关系
////////// CDC -> HDC ///////////////
CDC* pCDC = this->GetDC() ;
HDC hDC;

// 第1种获取方法
hDC = pCDC->GetSafeHdc();
// 第2种获取方法
dc.Attach(hDC);
////////// HDC -> CDC ///////////////
HDC hDC;
CDC *pCDC = CDC::FromHandle(hDC);
9.进程间通信
Linux的进程间通信方法有管道(Pipe)和有名管道(FIFO)、信号(Signal)、消息队列(Message Queue)、共享内存(Shared Memory)、信号量(Semaphore)、套接字(Socket)等。
10.消息发送
1)机器之间发送接收消息(unix平台):
#include <sys/ipc.h>
#include <sys/msg.h>
SERVER:
//通过ftok函数得到指定的ID。
key_t key = ftok(".", 111); //第二个参数随便给
if(key == -1)
{
perror(“ftok 创建失败”);
exit(-1);
}
cout << “通过ftok函数创建指定的ID” << endl;
//创建一个消息队列对象
int msgid = msgget(key, IPC_CREAT|IPC_EXCL|0777);
if(msgid == -1)
{
perror(“创建这个消息队列失败!”);
exit(-1);
}
cout << “创建talker消息队列成功!” << endl;
cout << “这个队列的ID: " << msgid << endl;
//发送消息
int res = msgsnd(msgid, “Hello Msg!”, 10, 0);
if(res == -1)
{
perror(“消息发送失败:”);
exit(-1);
}
cout << “消息发送成功:server—>” << endl;
CLIENT:
//通过ftok函数得到指定的ID。
key_t key = ftok(”.", 111); //第二个参数随便给
if(key == -1)
{
perror(“ftok 获取失败”);
exit(-1);
}
cout << “通过ftok函数得到指定的ID” << endl;
//创建一个消息队列对象
int msgid = msgget(key, 0);
if(msgid == -1)
{
perror(“创建这个消息队列失败!”);
exit(-1);
}
cout << “创建lisenter消息队列成功!” << endl;
cout << "这个队列的ID: " << msgid << endl;
//存放接收的消息
char buffer[128];
//接收消息
int res = msgrcv(msgid, buffer, 128, 0, 0);
if(res == -1)
{
perror(“消息接收失败:”);
exit(-1);
}
cout << “消息接收成功:client->” << buffer << endl;
2)窗口之间消息发送接收
// 同步
BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
需要一个整个系统唯一的消息,可以调用 SDK 函数 RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指
// 广域发送消息 HWND_BROADCAST ((HWND)0xffff),
LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

3)窗口句柄和窗口类
this->GetSafeHwnd() 与 this->m_hWnd 相等.
对话框中,有的控件不能使用,否则在VS2013中报错
箭头↓→↑←←↑→↓
AfxGetMainWnd()->m_hWnd;

CWnd * pCWnd;
HWND Handle;
pCWnd=FromHandle(Handle);
Handle=GetSafeHwnd(pCWnd);
11.下拉框的高度问题

//************* 设置2个下拉框的高度 **********************//////////////////////////////
CRect rc;
m_ComboBox_Factory.GetClientRect(&rc);
m_ComboBox_Factory.SetWindowPos(NULL, 0, 0, rc.Width(), rc.Height() + 100, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);

m_ComboBox_Protocol.GetClientRect(&rc);
m_ComboBox_Protocol.SetWindowPos(NULL, 0, 0, rc.Width(), rc.Height() + 100, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW);

12.ListControl问题
高亮选择
m_listControl_files.SetFocus();
m_listControl_files.SetItemState(0, LVNI_SELECTED, LVNI_SELECTED);

// 以下不能达到预期效果,原因待查… …
NMLISTVIEW nmlv;
memset(&nmlv, 0, sizeof (nmlv));
nmlv.hdr.hwndFrom = m_listControl_files.m_hWnd;
nmlv.hdr.idFrom = m_listControl_files.GetDlgCtrlID();

nmlv.hdr.code = LVN_ITEMCHANGED;
nmlv.iItem = 7;
nmlv.iSubItem = 0;
nmlv.uNewState = 3;
nmlv.uOldState = 0;
nmlv.uChanged = LVIF_STATE;
nmlv.lParam = 0;
m_listControl_files.GetParent()->SendMessage(WM_NOTIFY, nmlv.hdr.idFrom, (LPARAM)(&nmlv));
m_listControl_files.SetFocus();

13.资源 – 菜单,字符串,图标
CMenu* menu = GetMenu();
menu->CheckMenuItem(2052, MF_BYCOMMAND | MF_CHECKED);//设置选择状态

CString strAboutMenu;

CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

BOOL bNameValid;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

HICON m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
SetIcon(m_hIcon, TRUE);			// 设置大图标
SetIcon(m_hIcon, FALSE);		// 设置小图标

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

14.当前模块,线程,进程
//得到当前程序的路径;
wchar_t strPath[100];
GetModuleFileName(NULL, strPath, 100);

STARTUPINFO StartInfo;
PROCESS_INFORMATION procStruct;
memset(&StartInfo, 0, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);

if (CreateProcess((LPCTSTR)strPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &procStruct))
{
	CloseHandle(procStruct.hProcess);
	CloseHandle(procStruct.hThread);
}

15.鼠标位置 – 鼠标单击对象
CPoint point;
GetCursorPos(&point); //获取当前光标的位置,以便使得菜单可以跟随光标
ScreenToClient(&point); //得到窗体的控件句柄
CWnd* pWnd = (CWnd*)ChildWindowFromPoint(point);

if (pWnd != NULL){
}

16.常用API函数
::GetCurrentDirectory(MAX_PATHLENGTH, des.GetBuffer(MAX_PATHLENGTH));
GetPrivateProfileString(TEXT(“ExeFilePath”), TEXT(“ControlPanel”), TEXT(“TestApplication.exe”), SName.GetBuffer(MAX_PATHLENGTH), MAX_PATHLENGTH, des);

pParentWnd->SetRedraw(false);
pPictureControl->ShowWindow(true);

4)界面控件, 刷新等

TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;

pTTT->hinst = AfxGetResourceHandle();

CStaticExt* pPictureControl = (CStaticExt*)GetDlgItem(nID);

CException* e;
e->Delete();

UpdateWindow( );

pDC->SetBkMode(TRANSPARENT);
pDC->SetBkColor(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);

CImage		image;
HRESULT ret = image.Load(strFileName);

image.GetHeight();
pDC->SetStretchBltMode(HALFTONE);
image.Draw(pDC->GetSafeHdc(), 0, 0, rect.right - rect.left, rect.bottom - rect.top);

17.对话框上视图测试

void CPngFile::testView( ){
CDC* pDC;
RECT rect;

pDC = pParentWnd->GetDC();

pParentWnd->GetClientRect(&rect);
rect.bottom = 100;
rect.right = 100;
CRuntimeClass* pViewRuntimeClass = RUNTIME_CLASS(CViewExt);
CView *viewExt = (CViewExt*)pViewRuntimeClass->CreateObject();

//viewExt->Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect, pParentWnd, 123, NULL);

LONG style = 0;
CStatic* pPictureControl = (CStatic*)pParentWnd->GetDlgItem(IDB_PNG_ControlPanel1);
style = GetWindowLong(pPictureControl->GetSafeHwnd(), GWL_STYLE);
style |= WS_BORDER | SS_GRAYFRAME ;	// SS_BLACKFRAME SS_WHITEFRAME SS_GRAYFRAME

SetWindowLong(pPictureControl->GetSafeHwnd(), GWL_STYLE, style);

pPictureControl->ModifyStyle(SS_WHITEFRAME | WS_BORDER, 0);//去掉边框

}

18.界面控件遍历

HWND hwndChild = ::GetWindow(this->GetSafeHwnd(), GW_CHILD);
while (hwndChild)
{
	CRect rect;		//获取控件大小
	CRectOfControl m_CtrolRect;

	CWnd* pWnd = GetDlgItem(::GetDlgCtrlID(hwndChild));	//获取ID为woc的空间的句柄		
	pWnd->GetWindowRect(&rect);
	ScreenToClient(&rect);		//将控件大小转换为在对话框中的区域坐标
	
	int  nId = ::GetDlgCtrlID(hwndChild);//获得控件的ID;
	hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}

19.问题
CImageList m_l;
m_l.Create(1,18,TRUE|ILC_COLOR32,1,0);
listCtrl.SetImageList(&m_l,LVSIL_SMALL);
//pDC->FillSolidRect(&rectView, colorSkectchBackGround);
1.类的构造函数带参问题
2.HTREEITEM报错问题
HTREEITEM hParent = NULL;
hParent = m_tree_tools.GetParentItem(m_hTreeItemDrag);
if (!hParent) return ;
www.softWonder.com
3.CList::OnLvnItemchanged事件响应多次的解决方法:
OnLvnItemchangedListServices(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

if (nIndex >= 7) return;

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->uChanged != LVIF_STATE)
	return;
if (!(pNMListView->uNewState & LVIS_SELECTED))
return;

}
4.
colorHeaderText = (COLORREF)RGB(0, 0, 0); //(COLORREF)RGB(255,0, 0);
colorBodyText = (COLORREF)RGB(0, 0, 0); //(COLORREF)RGB(0, 0,255);

LOGFONT logFont;
pFontBodyTextNormal = GetFont(); // pDC->GetCurrentFont(); ///  pFont.CreateStockObject(SYSTEM_FONT);

pFontBodyTextNormal->GetLogFont(&logFont);
//logFont.lfEscapement = 0;		//900/10 = 90
logFont.lfHeight = -100;
//logFont.lfWidth = 0;
//logFont.lfOrientation = 0;
//logFont.lfWeight = FW_NORMAL;;

fontBodyTextNormal.DeleteObject() ;

fontBodyTextNormal.CreatePointFontIndirect(&logFont);
CList::OnLvnItemchanged事件响应多次的解决方法:
OnLvnItemchangedListServices(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

if (nIndex >= 7) return;

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if (pNMListView->uChanged != LVIF_STATE)
	return;
if (!(pNMListView->uNewState &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值