MFC学习中遇到的问题集合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/songqiu65/article/details/71057284

Q1:限制窗口大小
A1:类向导-》消息-》重载WM_GetMinMaxInfo-》填入代码

lpMMI->ptMinTrackSize.x = 500; // 设定最小跟踪宽度
    lpMMI->ptMinTrackSize.y = 400; // 设定最小跟踪高度
    lpMMI->ptMaxTrackSize.x = 500; // 设定最大跟踪宽度
    lpMMI->ptMaxTrackSize.y = 400; // 设定最大跟踪高度

Q2:MFC图片控件显示图片
A2:
//动态加载

int cx, cy;
CImage  image;
CRect   rect;
//根据路径载入图片
image.Load(L"main.bmp");
//获取图片的宽 高度
cx = image.GetWidth();
cy = image.GetHeight();
//获取Picture Control控件的大小
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rect);
//将客户区选中到控件表示的矩形区域内
ScreenToClient(&rect);
//窗口移动到控件表示的区域
GetDlgItem(IDC_STATIC1)->MoveWindow(rect.left, rect.top, cx, cy, TRUE);
CWnd *pWnd = NULL;
pWnd = GetDlgItem(IDC_STATIC1);//获取控件句柄
pWnd->GetClientRect(&rect);//获取句柄指向控件区域的大小
CDC *pDc = NULL;
pDc = pWnd->GetDC();//获取picture的DC
image.Draw(pDc->m_hDC, rect);//将图片绘制到picture表示的区域内
ReleaseDC(pDc);

//静态加载
/首先添加资源-》Bitmap-》导入-》选择图片-》资源视图-》记录rc中Bitmap的ID-》添加picture control控件并设置ID-》在OnPaint()函数里面添加下面代码/

//从资源中加载图片  
CBitmap bitmap;
//加载指定位图资源 Bmp图片ID  
bitmap.LoadBitmap(IDB_BITMAP1);
//获取对话框上的句柄 图片控件ID  
CStatic *p = (CStatic *)GetDlgItem(IDC_STATIC1);
//设置静态控件窗口风格为位图居中显示  
p->ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
//将图片设置到Picture控件上  
p->SetBitmap(bitmap);

Q3:MFC程序内存泄漏检测方法(debug):

A3:
1.在 CMyApp 中添加如下三个 CMemoryState 类的成员变量:

#ifdef _DEBUG
protected:
      CMemoryState m_msOld, m_msNew, m_msDiff;
#endif  // _DEBUG

2.在 CMyApp::InitInstance() 中添加如下代码:

#ifdef _DEBUG
      m_msOld.Checkpoint();
#endif  // _DEBUG

3.在 CMyApp::ExitInstance() 中添加如下代码:

#ifdef _DEBUG
      m_msNew.Checkpoint();
      if (m_msDiff.Difference(m_msOld, m_msNew))
      {
            afxDump<<"\nMemory Leaked :\n";
            m_msDiff.DumpStatistics();
            afxDump<<"Dump Complete !\n\n";
      }
#endif  // _DEBUG

Q4:mfc查看内存泄露
A4:Debug版本程序运行结束后如有内存泄漏,输出窗口中会显示类似信息:
Memory Leaked :
0 bytes in 0 Free Blocks.
8 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 8825 bytes.
Total allocations: 47506 bytes.
Dump Complete !

Detected memory leaks!
Dumping objects ->
g:\programs\chat\chatdlg.cpp(120) : {118} normal block at 0x00D98150, 8 bytes long.
Data: < > A8 7F D9 00 01 00 00 00(这里表示有泄露)
Object dump complete.

Q5:UpdateData
A5:
UpdateData(true);//用于将屏幕上控件中的数据交换到变量中。
UpdateData(false);//用于将数据在屏幕中对应控件中显示出来。

Q6:Run-Time Check Failure #2 - Stack around the variable ” was corrupte
A6:一般情况是越界(如数组)

Q7:list control
A7:添加变量名m_list;
设置列表头:

m_list.InsertColumn(0,"用户名:",LVCFMT_LEFT,147);
m_list.InsertColumn(1, "密码:", LVCFMT_LEFT, 147);
/*其参数依次表示:列号,列标题,   对齐方式,列宽*/

添加值:

m_list.InsertItem(0, num);
m_list.SetItemText(0,1, pass);

设置风格:

m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES);

/*LVS_EX_FULLROWSELECT 选中某行使整行高亮(只适用与report风格的listctrl)
LVS_EX_GRIDLINES 网格线(只适用与report风格的listctrl)
LVS_EX_CHECKBOXES item前生成checkbox控件*/

删除i项:
int nItemCount=m_list.GetItemCount();/*获取项数*/
m_list.DeleteItem(i);/*删除i项*/

删除全部:m_list.DeleteAllItems();
添加右键响应:鼠标右键-》添加事件处理程序-》消息类型按下面需求选、类列表选好
/*LVN_COLUMNCLICK在单击列表的标题栏才响应;
NM_CLICK是在单击一个的列表项才响应。
HDN_ITEMCLICK是标题栏的单击事件。
NM_DBLCLK是在右键双击一个的列表项才响应。*/

获取右键选中项内容:在上面添加的函数里面添加下面代码:

CString strText;
POSITION pos = m_mpfriends_friendslist.GetFirstSelectedItemPosition();
if (pos != NULL)
{
    int nItem = m_mpfriends_friendslist.GetNextSelectedItem(pos);
    strText = m_mpfriends_friendslist.GetItemText(nItem, 0);
    MessageBox(strText);
}

插入一行多列只显示第一列原因:SetItemText()之前没有进行InsertItem()(这个最好在oninitdialog()里面)
Q8:显示窗口
A8:
非模态对话框显示窗口(优势:还可以操作原窗口):

CMpchat *chatpanel;
chatpanel = new CMpchat;
chatpanel->Create(IDD_MP_CHAT, this);/*参数说明:第一个参数为资源视图中dialog的CMpchat的ID*/  
chatpanel->ShowWindow(SW_SHOW);/*记住要delete*/

模态对话框:

CMpchat chatpanel;
chatpanel.DoModal();

Q9:MFC程序开发时,经常会出现没有最大和最小化按钮的问题
A9:在窗口文件右击-属性-System Menu,设置为true。

Q10:CString汉字怎么存到char*
A10:

WideCharToMultiByte(CP_ACP, 0, m_chatedit/*CString*/, -1, LG.nDATA/*char数组*/, t/*CString.GetLength()*/*2 + 1, NULL, NULL);

Q11:edit control控件中‘\n’换行符无效
A11:请尝试 ‘\r\n’

Q12:Csocket服务器接收文件时锁住了ui,程序正常运行
A12:可能前面出现了EnableWindow(false);需要在结束的地方添加EnableWindow(true);

猜你喜欢

转载自blog.csdn.net/songqiu65/article/details/71057284