mfc

阅读 / 问答 / 标签

MFC中Listcontrol控件插入的内容怎么显示在同一行?它老是一列显示

。。。你理解错了。m_connlist->InsertItem(0,"asdf"); //参数1是行下标,从0开始插入行 m_connlist.SetItemText(j,2, "这个是列数据");// 表示 j行2列m_list.InsertItem(0,"styleman");m_list.SetItemText(0,1, "111");m_list.SetItemText(0,2, "男");m_list.SetItemText(0,3, "计算机");understand?

MFC对话框输出信息表示

你应该将这个列表框关联一个CListCtrl类型的变量;如CListCtrl m_ctlList;然后在对话框的OnInitDialog()函数中,增加三个标题头,通过调用CListCtrl的int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1 )方法;参数: nCol 新建列的索引值。 pColumn 包含新建列属性的LVCOLUMN结构的地址。 lpszcolumnHeading 包含列标题的字符串的地址。 nFormat 指定列对齐方式的整数。它为下列值之一:LVCFMT_LEFT,LVCFMT_RIGHT或LVCFMT_CENTER。 nWidth 以像素为单位的列宽。如果该参数为-1,那么没有设置列宽。 nSubItem 与列相关联的子项的索引。如果该参数为-1,那么没有子项与列相关。 如:m_ctlList.InsertColumn(0,"食品"LVCFMT_LEFT,95);//插入表头标题m_ctlList.InsertColumn(1,"价格"LVCFMT_LEFT,95);//插入表头标题m_ctlList.InsertColumn(2,"金额"LVCFMT_LEFT,95);//插入表头标题然后,你在为“确定”按钮添加事件处理函数;在响应函数中:1.首先调用UpdateData(TRUE);更新控件上的值2.获取各个控件上的值,(用GetDlgItemText()函数)3.然后插入到列表框当中,调用CListCtrl的int InsertItem(int nItem,LPCTSTR lpszItem)函数如: m_ctlList.InsertItem(0,“面包”); m_ctlList.InsertItem(1,“20元”);大题思路就是这样的;附录:CListCtrl::InsertItemint InsertItem(const LVITEM* pItem)int InsertItem(int nItem,LPCTSTR lpszItem)int InsertItem(int nItem, LPCTSTR lpszItem,int nImage)int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam )返回值:如果成功,则返回新建列的索引值,否则为-1。参数: pItem 指向指定项属性LVITEM结构的指针,如联机文档“平台SDK”中所述。 nItem 被插入项的索引值。 lpszItem 包含项标签的字符串的地址,或当项为回调项时,该变量为LPSTR_TEXT CALLBACK。要了解更多有关回调项的信息,请参阅CListCtrl::GetCall backMask. nImage 项图象的索引值,或当项为回调项时,该变量为I_IMAGECALLBACK。要了解更多有关回调项的信息,请参阅CListCtrl::GetCallbackMask nMask 参数nMask指定了哪个项属性作为参数传递是有效的。它可以是联机文档“平台SDK” 中LVITEM结构所描述的一个或多个掩码值。有效的数据能够通过位与运算来组合。 nState 指示项的状态、状态图象及轮廓图象。请参阅联机文档“平台SDK”中的LVITEM来获取更多信息,并参阅有效标志列表中的列表视图项状态。 nStateMask 指示状态成员中的哪一位将被获取或修改。请参阅联机文档“平台SDK”中的LVITEM来获取更多信息。 nImage 图象列表之内项的图象的索引。 lParam 与项相关联的应用指定的32位值。如果该参数被指定,那么必须设置nMask的属性为LVIF_PARAM。 说明:向列表视图控件中新插入一项。附录2:CListCtrlCObject └CCmdTarget └CWnd └CListCtrl CListCtrl类封装“列表视图控件”功能,显示每个包含图标(列表视图中)和标签的收集。除图标和标签外,每一项还能有显示在图标和标签的右边的列中的信息。此控件(以及CListCtrl类)只适用于运行于Windows 95和Windows NT 3.51及更高版本的程序。下面是CListCtrl类的主要概况。对于详细的、概念性的讨论,请参阅联机文档“Visual C++程序员指南”中的“使用ClistCtrl”和“控件主题”。视图列表视图控件可用四种不同方式显示其内容,称为“视图”。 · 图标视图每一项以全尺寸图标(32×32像素)出现,下面有一个标签。用户可在列表视图窗口拖动项到任意位置。 · 小图标视图每一项以小图标(16×16像素)出现,右边有一个标签。用户可在列表视图窗口拖动项到任意位置。 · 列表视图每一项以小图标出现,下面有一个标签。项按列排列,不能拖动到列表视图窗口的任何位置。 · 报表视图每一项在本行上出现,右边有排列成列的附加信息。最左边的列包含小图标和标签,下一列包含应用指定的子项。嵌入标题控件实现这些列。要了解报表视图标题控件和列的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:给控件添加列(报表视图)”。 控件的当前列表视图风格指定当前视图。要了解这些风格及其用法的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。扩展风格除了标准列表风格,类CListCtrl支持一系列提供丰富功能的扩展风格。此功能的一些示例包括: · 逗留选择有效时,若光标保持在某项上一段时间,则允许自动选择该项。 · 虚列表视图如果有效,允许控件支持DWORD项。通过把管理应用项数据放在最顶上而成为可能。除了项选择和焦点信息,所有项信息必须由应用管理。要了解更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:虚列表控件”。 · 单击或双击激活如果有效,允许热跟踪(项文本自动高亮显示)和高亮显示项的单击和双击激活。 · 拖放列表命令如果有效,允许拖放列表视图控件中列的记录。只对报表视图有效。 要了解使用新扩展风格的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。项和子项列表视图控件中的每一项含有一个图标、一个标签、一个当前状态和应用定义值(称为“项数据”)。一个或更多子项还可与每一项联系。一个“子项”是一个字符串,在报表视图中可显示在项图标和标签右边的列里。列表视图控件中的每一项都必须与子项数目相同。类CListCtrl提供一些函数来插入、删除、查找和更改这些项。要了解更多信息,请参阅“Visual C++程序员指南”中的“使用CListCtrl:列表控件中的滚动、排列、排序和查找”。同时请参阅CListCtrl::GetItem,CListCtrl::InsertItem和CListCtrl::FindItem。缺省时,列表视图控件负责存储一个项的图标和文本属性。然而,除了这些项类型外,类CListCtrl支持“回调项”。一个“回调项”是一个列表视图项,每个应用枣而不是控件枣存储文本,图标或两者。回调掩码用于指定哪个项的属性(文本和/或图标)由应用提供。如果应用使用回调项,它必须可以提供按需要提供文本和/或图标属性。回调项在你的应用已有部分这种信息时很有帮助。要了解更多信息,请参阅CListCtrl::GetCallBackMask和“使用CListCtrl:回调项和回调掩码”。图象列表图标、标题项图象和应用定义的列表视图项状态包含在一些图象列表中(由类CImageList实现),可创建和指派到列表视图控件中。每个列表视图控件可有四个以上的图象列表类型: · 大图标在图标视图中使用,得到全尺寸图标。 · 小图标用于小图标、列表和报表视图中,得到图标视图中使用的小版本的图标。 · 应用定义的状态包含状态图象,在项图标旁显示以指示一个应用定义状态。 · 标题项用于在报表视图中,得到出现在每个标题控件项中的小图象。 缺省时,列表视图控件删除指派给它的图象列表(当它删除时);然而,开发者可通过删除由应用定义的不再使用的图象列表。要了解更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:列表项和图象列表”。#include <afxcmn.h>请参阅:CImageListCListCtrl类的成员构造函数 ClistCtrl 构造一个CListCtrl对象 Create 创建列表控件并将其附加给CListCtrl对象 属性 GetBkColor 获取列表视图控件的背景色 SetBkColor 设置列表视图控件的背景色 GetImageList 获取用于绘制列表视图项的图象列表的句柄 SetImageList 指定一个图象列表到列表视图控件 GetItemCount 获取列表视图控件中的项的数量 GetItem 获取列表视图项的属性 GetCallbackMask 获取列表视图控件的回调掩码 SetCallbackMask 设置列表视图控件的回调掩码 GetNextItem 查找指定特性和指定指定项关系的列表视图项 GetFirstSeletedItemPosition 在列表视图控件中获取第一个选择的列表视图项的位置 GetNextSeletedItem 为重复而获取下一个选择的列表视图 GetItemRect 获取项的有界矩形 SetItemPosition 在列表视图控件中移动一项到指定位置 GetItemPosition 获取列表视图项的位置 GetStringWidth 指定需要显示所有指定字符串的最小列宽 GetEditControl 获取用于编辑一个项文本的编辑控件的句柄 GetColumn 获取控件的列的属性 SetColumn 设置列表视图列的属性 GetColumnWidth 获取报表视图或列表视图中的列的宽度 SetColumnWidth 改变报表视图或列表视图中的列的宽度 GetCheck 获取与某项相关的状态图象的当前显示状态 SetCheck 设置与某项相关的状态图象的当前显示状态 GetViewRect 获取列表视图控件中所有项的有界矩形 GetTextColor 获取列表视图控件的文本颜色 SetTextColor 设置列表视图控件的文本颜色 GetTextBkColor 获取列表视图控件的文本背景色 SetTextBkColor 设置列表视图控件的文本背景色 GetTopIndex 获取最高级项的索引 GetCountPerPage 计算可正好垂直放入列表视图控件中的项的数目 GetOrigin 获取列表视图控件的最初的当前视图 SetItemState 改变列表视图控件的项的状态 GetItemState 获取列表视图控件的项的状态 GetItemText 获取列表视图项或子项的文本 SetItemText 设置列表视图项或子项的文本 SetItemCount 准备一个列表视图控件以添加大量的项 GetItemData 获取与某项相关的应用所指定的值 SetItemData 设置项的应用指定的值 GetSelectedCount 获取列表视图控件中选择项的数量 SetColumnOrderArray 设置列表视图控件的列序(左或右) GetColumnOrderArray 获取列表视图控件的列序(左或右) SetIconSpacing 设置列表视图控件中的图标的距离 GetHeaderCtrl 获取列表视图控件的标题控件 GetHotCursor 获取在热调试对列表视图控件有效时使用的游标 SetHotCursor 设置在热调试对列表视图控件有效时使用的游标 GetSubItemRect 获取列表视图控件中某项的有界矩形 GetHotItem 获取当前在游标下的列表视图项 SetHotItem 设置列表视图控件的当前热项 GetSelectionMark 获取列表视图控件的选择屏蔽 SetSelectionMark 设置列表视图控件的选择屏蔽 GetExtendedStyle 获取列表视图控件的当前扩展风格 SetExtendedStyle 设置列表视图控件的当前扩展风格 SubItemHitTest 指定哪个列表视图项在指定位置,若存在 GetWorkAreas 获取列表视图控件的当前工作区 GetNumberOfWorkAreas 获取列表视图控件的当前工作区数量 SetItemCountEx 设置虚列表视图控件的项的数量 SetWorkAreas 设置列表视图控件中图标可以显示的区域 ApproximateViewRect 指定显示列表视图控件项所需的宽度和高度 GetBkImage 获取列表视图控件的当前背景图象 SetBkImage 设置列表视图控件的当前背景图象 GetHoverTime 获取列表视图控件的当前逗留时间 SetHoverTime 设置列表视图控件的当前逗留时间 操作 InsertItem 在列表视图控件中插入一个新项 DeleteItem 从控件中删除一项 DeleteAllItems 从控件中删除所有项 FindItem 查找具有指定的字符的列表视图项 SortItems 使用应用定义的比较函数排序列表视图项 HitTest 指定哪个列表视图在指定的位置上 EnsureVisible 保证项是可见的 Scroll 滚动列表视图控件的内容 ReDrawItems 强迫列表视图控件刷新一些项 Update 强迫控件刷新一个指定的项 Arrange 调整一栏里的项 EditLabel 开始项文本该处编辑 InsertColumn 插入列表视图控件中的新列 DeleteColumn 从列表视图控件中删除一列 CreateDragImage 为指定的项构造一个拖动图象列表 可覆盖的函数 DrawItem 当自绘制控件的可视部分改变时被调用

mfc怎么向listctrl中添加一行数据

看个例子C/C++ code// The pointer to my list view control.extern CListCtrl* pmyListCtrl;CString strText;int nColumnCount = pmyListCtrl->GetHeaderCtrl()->GetItemCount();// Insert 10 items in the list view control.for (int i=0;i < 10;i++){ strText.Format(TEXT("item %d"), i); // Insert the item, select every other item. pmyListCtrl->InsertItem( LVIF_TEXT|LVIF_STATE, i, strText, (i%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0); // Initialize the text of the subitems. for (int j=1;j < nColumnCount;j++) { strText.Format(TEXT("sub-item %d %d"), i, j); pmyListCtrl->SetItemText(i, j, strText); }}------解决方案--------------------给你个例子。。。m_list.InsertColumn(0,"Col 1"); m_list.InsertColumn(1,"Col 2"); m_list.InsertColumn(2,"Col 3"); m_list.InsertColumn(3,"Col 4"); m_list.InsertItem(0,"row1",0); CString stemp =""; for(int i =0;i<4;i++) { stemp.Format("row 0 %d",i); m_list.SetItemText(0,i,stemp); } m_list.InsertItem(0,"row befor prev",0); m_list.InsertItem(2,"row after prev",0);注意InsertItem的第一个参数结果因该是这样的row befor prev

MFC中向listctrl中添加不了数据。OnInitialUpdate方法中通过m_list.InsertColumn()插入了列标题正常显示

m_list.InsertItem(0,"11111");如果仅仅执行这一句可以成功吗?如果可以试一试改成这样 int index=m_list.InsertItem(0,"11111"); m_list.SetItemText(index,1,"22222");

VC的MFC关于子窗口中的列表控件(LIST控件)在主窗口中调用问题,悬赏!!!

CListCtrl::InsertItem的起始值是0,m_CalList.InsertItem(1,"Time"); 应该是0。 你的CListCtrl是怎么创建的?跟窗口上的List相关联了吗?

MFC TabCtrl控件 InsertItem功能运行时报错的问题

CTabCtrl m_tab最好不要声明为局部变量,还有可以单步跟踪调试一下。

MFC中列表控件怎么插入整形的数据,用InsertItem和SetItemText都提示类型错误,该怎么改?

CSstring item.Format("%d", i);m_ctllist.InsertItem(i,item, i);

vs2010,mfc编程中,遇到 1 IntelliSense: 没有与参数列表匹配的 重载函数 "CTreeCtrl::InsertItem" 实例

m_treeAdapater.InsertItem(m_pDev->name,root, NULL);就可以.这种问题你百度InsertItem就知道这个函数没有2个参数的用法

VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???

楼主算是问对人了,我刚做完一个。步骤:1.新建一个以cformview作为基类的单文档;2.将tab控件拖拽至你需要的位置3.在视图类的oninitialupdate()(需要重载)中添加初始化代码4.重载onsize()以调整tab控件的大小5.在视图类中重载ontcnselchangetab1(nmhdr*pnmhdr,lresult*presult)函数以响应tab控件切换。不懂再追问!

兄弟牌一体机 型号是MFC7420 复印就提示Faild to warming up(好像是这个词 反正意思就是预热失败)

可能

fatal error C1189: MFC requires C++ compilation(use a .cpp suffix)

MFC只能用到C++语言中。C语言里不要用MFC!

MFC中,API的关机函数

这个哪个在前都可以了,不过需要权限才能够关机.

MFC ListControl插入列,列表框还是空的没有显示?

对话框框资源编辑器 设置 listctr 控件的风格为 report 默认为icon

MFC,ListBox使用 InsertColumn添加列,在列表框中却无论如何都不显示,很是郁闷,求解,正解追加高分。

控件属性-》外观-》view 默认是icon 改成report就可以了。。望采纳

找遍网络,也没有一个能用win32 sdk 自绘listview控件的示例,都是mfc的 ,哎。有大神能给一个吗?

msdn 有给例子 的 PALLETIZED.CPP 自己找谷歌去PALLETIZED.CPP/*++Copyright (c) 1998 Microsoft CorporationAll rights reserved.Module Name:Palletized--*/// Palettized List View// By MarkFi, April 1998// Requires at least COMCTL32 4.70 (IE3)// Included files#include <windows.h>#include <commctrl.h>#include "resource.h"// Global variablesHWND hLV = NULL;HPALETTE hLVPalette = NULL;// Create palette from DIB SectionHPALETTE CreateDIBSectionPalette(HBITMAP hBitmap){ BITMAP bm; HPALETTE hPalette; // Get the color depth of the DIBSection GetObject(hBitmap,sizeof(BITMAP),&bm); // If the DIBSection is 256 color or less, it has a color table if((bm.bmBitsPixel*bm.bmPlanes) <= 8) { HDC hMemDC; HBITMAP hOldBitmap; RGBQUAD rgb[256]; LPLOGPALETTE pLogPal; WORD i; int nColors; // Find out how many colors are in the color table nColors = 1 << (bm.bmBitsPixel*bm.bmPlanes); // Create a memory DC and select the DIBSection into it hMemDC = CreateCompatibleDC(NULL); hOldBitmap = SelectObject(hMemDC,hBitmap); // Get the DIBSection"s color table GetDIBColorTable(hMemDC,0,nColors,rgb); // Create a palette from the color table pLogPal = malloc(sizeof(LOGPALETTE)+(nColors*sizeof(PALETTEENTRY))); pLogPal->palVersion = 0x300; pLogPal->palNumEntries = nColors; for(i=0;i<nColors;i++) { pLogPal->palPalEntry[i].peRed = rgb[i].rgbRed; pLogPal->palPalEntry[i].peGreen = rgb[i].rgbGreen; pLogPal->palPalEntry[i].peBlue = rgb[i].rgbBlue; pLogPal->palPalEntry[i].peFlags = 0; } hPalette = CreatePalette(pLogPal); // Clean up free(pLogPal); SelectObject(hMemDC,hOldBitmap); DeleteDC(hMemDC); } else // It has no color table return NULL; return hPalette;}// Main window procedureLRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam){ switch(iMsg) { case WM_NOTIFY: { // Handle custom draw notifications LPNMHDR pNM = (LPNMHDR)lParam; if(pNM->hwndFrom == hLV && pNM->code == NM_CUSTOMDRAW) { // Custom draw from List View LPNMLVCUSTOMDRAW pCD = (LPNMLVCUSTOMDRAW)lParam; if(pCD->nmcd.dwDrawStage == CDDS_PREPAINT) return CDRF_NOTIFYITEMDRAW; else if(pCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { // Select and realize palette SelectPalette(pCD->nmcd.hdc,hLVPalette,FALSE); RealizePalette(pCD->nmcd.hdc); return CDRF_DODEFAULT; } } } break; case WM_QUERYNEWPALETTE: case WM_PALETTECHANGED: // Invalidate List View to refresh palette InvalidateRect(hLV,NULL,FALSE); break; case WM_COMMAND: // Check for menu selection if(!HIWORD(wParam)) { BOOL bHandled = TRUE; LONG dNotView = ~(LVS_ICON|LVS_SMALLICON|LVS_LIST|LVS_REPORT); // Menu selection switch(LOWORD(wParam)) { case IDM_ICON: SetWindowLong(hLV,GWL_STYLE,GetWindowLong(hLV,GWL_STYLE)&dNotView|LVS_ICON); break; case IDM_SMALLICON: SetWindowLong(hLV,GWL_STYLE,GetWindowLong(hLV,GWL_STYLE)&dNotView|LVS_SMALLICON); break; case IDM_LIST: SetWindowLong(hLV,GWL_STYLE,GetWindowLong(hLV,GWL_STYLE)&dNotView|LVS_LIST); break; case IDM_REPORT: SetWindowLong(hLV,GWL_STYLE,GetWindowLong(hLV,GWL_STYLE)&dNotView|LVS_REPORT); break; case IDM_ALIGNLEFT: ListView_Arrange(hLV,LVA_ALIGNLEFT); break; case IDM_ALIGNTOP: ListView_Arrange(hLV,LVA_ALIGNTOP); break; case IDM_DEFAULT: ListView_Arrange(hLV,LVA_DEFAULT); break; case IDM_SNAPTOGRID: ListView_Arrange(hLV,LVA_SNAPTOGRID); break; default: bHandled = FALSE; break; } if(bHandled) return 0; } break; case WM_SIZE: { RECT rectClient; GetClientRect(hwnd,&rectClient); SetWindowPos(hLV,NULL,0,0,rectClient.right-rectClient.left,rectClient.bottom-rectClient.top,SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); } break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,iMsg,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){ static char szAppName[] = "SimpleLV"; HWND hwnd; MSG msg; RECT rectClient; WNDCLASSEX wndclass; // Initialize common controls InitCommonControls(); // Setup window class wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wndclass); // Create main window hwnd = CreateWindowEx(0,szAppName,"Palettized List View",WS_OVERLAPPEDWINDOW,275,200,400,300,NULL,NULL,hInstance,NULL); SetMenu(hwnd,LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU))); GetClientRect(hwnd,&rectClient); // Create and fill list view hLV = CreateWindowEx(0,WC_LISTVIEW,NULL,WS_CHILD|WS_VISIBLE,0,0,rectClient.right-rectClient.left, rectClient.bottom-rectClient.top,hwnd,NULL,hInstance,NULL); { LPSTR pLabel[] = { "Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune","Pluto" }; CHAR szLabel[81]; HIMAGELIST hILLarge; HIMAGELIST hILSmall; HBITMAP hBitmap; LVITEM lvItem; LVCOLUMN lvColumn; INT dIndex; INT x; INT y; // Create image lists as DIB Section 24-bit color // Large image list hILLarge = ImageList_Create(32,32,ILC_COLOR24|ILC_MASK,9,1); hBitmap = LoadImage(hInstance,MAKEINTRESOURCE(IDB_PLANETS),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); // Get palette of large bitmap and use as List View"s palette hLVPalette = CreateDIBSectionPalette(hBitmap); ImageList_AddMasked(hILLarge,hBitmap,RGB(0,255,255)); DeleteObject(hBitmap); // Small image list hILSmall = ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,9,1); hBitmap = LoadImage(hInstance,MAKEINTRESOURCE(IDB_PLANETSSMALL),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION); ImageList_AddMasked(hILSmall,hBitmap,RGB(0,255,255)); DeleteObject(hBitmap); // Assign image lists to control ListView_SetImageList(hLV,hILLarge,LVSIL_NORMAL); ListView_SetImageList(hLV,hILSmall,LVSIL_SMALL); // Add columns lvColumn.mask = LVCF_TEXT|LVCF_WIDTH; lvColumn.cx = 125; lvColumn.pszText = szLabel; // Column 0 strcpy(szLabel,"Column 2"); ListView_InsertColumn(hLV,0,&lvColumn); // Column 1 strcpy(szLabel,"Column 1"); ListView_InsertColumn(hLV,0,&lvColumn); // Column 2 strcpy(szLabel,"Column 0"); ListView_InsertColumn(hLV,0,&lvColumn); // Add items ZeroMemory(&lvItem,sizeof(LVITEM)); for(x=8;x>=0;x--) { lvItem.mask = LVIF_TEXT|LVIF_IMAGE; lvItem.iItem = 0; lvItem.iSubItem = 0; lvItem.pszText = pLabel[x]; lvItem.iImage = x; dIndex = ListView_InsertItem(hLV,&lvItem); // Add subitems for(y=1;y<3;y++) { lvItem.mask = TVIF_TEXT; lvItem.iItem = dIndex; lvItem.iSubItem = y; lvItem.pszText = szLabel; wsprintf(szLabel,"Sub Item %d,%d",x,y-1); ListView_SetItem(hLV,&lvItem); } } } // Show main window ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); // Message loop while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}Built on: Wednesday, October 20, 1999

MFC中 ListCtrl的用法

tWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE); //获取当前窗口style lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style lStyle |= LVS_SHOWSELALWAYS; SetWindowLong(m_ListCtrl.m_hWnd, GWL_STYLE, lStyle); //设置style DWORD dwStyle = m_ListCtrl.GetExtendedStyle(); //获取当前扩展样式 dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时) dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时) dwStyle |= LVS_EX_MULTIWORKAREAS; // dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件 //dwStyle |= LVS_EX_FLATSB; //扁平拖动 m_ListCtrl.SetExtendedStyle(dwStyle); //设置扩展风格 char *szColUmn[] = ; int nColWidth[] = ; LVCOLUMN lvc; lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER; lvc.fmt = LVCFMT_LEFT; //左对齐 for (int i = 0; i < 2; i++) { lvc.pszText = szColUmn[i]; lvc.iSubItem = i; lvc.iOrder = i; lvc.cx = nColWidth[i]; m_ListCtrl.InsertColumn(i, &lvc); }这个是我以前写过的。呵呵,按着我这个模仿一下吧。

MFC,想要用listcontrol显示表中数据

CListCtr的用法:-------------------------------------------------------------------------------1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,"查看"标签下的"大图标,小图标,列表,详细资料--------------------------------------------------------------------------------2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件m_list.SetExtendedStyle(dwStyle); //设置扩展风格--------------------------------------------------------------------------------3. 插入数据m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );//新插入的在上面int nRow = m_list.InsertItem(0, "11");// 插入行m_list.SetItemText(nRow, 1, "jacky");//设置其它列数据//新插入的数据在下面int nIndex = m_list.GetItemCount();LV_ITEM lvItem;lvItem.mask = LVIF_TEXT ;lvItem.iItem = nIndex; //行数lvItem.iSubItem = 0;lvItem.pszText = (char*)(LPCTSTR)strCount; //第一列//在最后一行插入记录值.m_list.InsertItem(&lvItem);//插入其它列m_list.SetItemText(nIndex,1,strLat);--------------------------------------------------------------------------------

VC中的MFC控件control不见了怎么找回来?

View菜单 Toolbox 反正就是Toolbox工具栏 自己找吧

MFC列表控件如何做成这种风格?就是需要每一项前面都要有一个打钩的,然后最关键的是我想要复选了这么多项

给复选框设定编号,绘制时保存名字,根据编号查找名称。

MFC 中CListCtrl控件的作用

这个推荐你看微软的MSDN里面最详细 其它给一点参考 在 VC中使用控件一直是件让我头痛的事件,从控件的创建到控件的操作管理,都得写一大堆代码,相比于Delphi/VB,实在是麻烦多了。其实在之前学习 SDK的时候,就有想过专门花点儿时间来学习VC中控件的使用,但一直没空。最近准备写一个小工具,要用到ListCtrl控件,所以又不得不好好的恶补 一翻。我是在MFC的对话框模式下使用CListCtrl控件的,其实不管在SDK或文档/视图模式下,VC控件的使用都差不多,下面来好好的写写CListCtrl控件的使用笔记。一、CListCtrl控件的创建由于我是在MFC的对话框模式下使用CListCtrl控件的,所以只需要在控件栏上选择CListCtrl的图形按钮,接着添加到对话框中就行了。二、CListCtrl控件样式的设置第一步:在使用CListCtrl控件之前,首先需要为该控件关联一个变量(只针对于对话框模式):CListCtrl m_BlogAccountList;第二步:由于CListCtrl控件要做一些初始化操作,比如设置控件样式,设置控件的行列并填入一些数据。初始化操作的代码是在对话框的OnInitDialog事件中写入的。默 认情况下,CListCtrl控件的样式是非常简陋的,大多情况下我们都需要对CListCtrl控件的样式进行修改,比如设置为报表样式,可以进行整行 选择等,如有需要还有调整CListCtrl控件的行高。诸如这些设置都需要用到CListCtrl控件的扩展样式,所以首先得了解这些扩展样式。我在MSDN中没有找到CListCtrl控件的扩展样式资料,只好上百度百科找了找。CListCtrl控件的扩展样式LVS_EX_GRIDLINES //绘制表格线LVS_EX_SUBITEMIMAGES//子项目图标列表LVS_EX_CHECKBOXES //带复选框LVS_EX_TRACKSELECT //自动换行LVS_EX_HEADERDRAGDROP//报表头可以拖拽LVS_EX_FULLROWSELECT //选择整行LVS_EX_ONECLICKACTIVATE//单击激活LVS_EX_TWOCLICKACTIVATE//双击激活LVS_EX_FLATSB//扁平滚动条LVS_EX_REGIONALLVS_EX_INFOTIPLVS_EX_UNDERLINEHOTLVS_EX_UNDERLINECOLDLVS_EX_MULTIWORKAREAS//多工作区对话框模式下创建的CListCtrl控件样式只有一个,就是WS_BORDER,而我需要为CListCtrl设置为报表样式,并能选择整行,下面就可以开始写代码了://通过GetWindowLong来获取CListCtrl已有的样式DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE);//在原有样式的基本上,添加LVS_REPORT扩展样式SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT); //获取已有的扩展样式DWORD dwStyles = m_BlogAccountList.GetExStyle();//取消复选框样式dwStyles &= ~LVS_EX_CHECKBOXES;//添加整行选择和表格线扩展样式m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);通过以上四句代码,就已经能满足我的需求了。三、为CListCtrl控件添加列列的添加只需要用到LVCOLUMN结构体,所以需要先行了解了解。在MSDN中查到的LVCOLUMN结构体的定义如下:typedef struct _LVCOLUMN { UINT mask; int fmt; int cx; LPTSTR pszText; int cchTextMax; int iSubItem; #if (_WIN32_IE >= 0x0300) int iImage; int iOrder;#endif} LVCOLUMN, FAR *LPLVCOLUMN; 该结构体共有8个成员。mask是用来设置LVCOLUMN结构体中哪些成员有效,其值可以为0。mask可设置的值如下:LVCF_FMT fmt成员有效LVCF_IMAGE iImage成员有效 LVCF_ORDER //以下略LVCF_SUBITEM LVCF_TEXT LVCF_WIDTH fmt成员是对CListCtrl控件列标题进行设置,比如列标题中文字的对齐方式,是否在列标题中显示图标等。cx成员是设置列宽。pszText成员是设置列标题文字cchTextMax成员是设置标题文字的缓冲区大小iSubItem成员是设置列索引iImage成员是设置ImageList中的图像索引。iOrder成员的作用未知。下面进行添加列操作:char *szColUmn[] = {"帐号", "密码"};int nColWidth[] = {100, 100};LVCOLUMN lvc;lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;lvc.fmt = LVCFMT_LEFT; //左对齐for (int i = 0; i < 2; i++){ lvc.pszText = szColUmn[i]; lvc.iSubItem = i; lvc.iOrder = i; lvc.cx = nColWidth[i]; m_BlogAccountList.InsertColumn(i, &lvc);}四、为CListCtrl控件添加行添加行的操作需要用到InsertItem和SetItemText属性,这个简单,就不详述了,看代码:m_BlogAccountList.InsertItem(0, "abc"); m_BlogAccountList.SetItemText(0, 1, "abc");m_BlogAccountList.SetItemText(1, 1, "123");

MFC中GetPlayState的定义是什么?

可以查看MSDN中有相关的解释

C++ MFC的slider控制画图问题

你这个情况肯定是在父对话框里面 刷新,你把画图那部分 在控件新类里面画,这样只要刷新控件就行。............改变的值通过参数传进去,然后重画!很简单啊!

MFC 中滑动条控件(slider)怎么 设置范围精确到小数

slider标准控制肯定是整数范围的。如果你不重载标准控件做自己的滑块,那么还有一个迂回的办法:不使用滑块的标准显示,假设滑块设定的范围是1000,下面用static或者tip自己做一个显示,比如获取值是456,那么代码中除以100,static显示4.56即可,没有其它太好的办法。

mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新

你上面说×1000,程序里面是×10000,应该是溢出了吧

关于MFC中Slider(滑动)控件的使用

可能没有关联. 如果在CPP中没有找到:DDX_Control(pDX, ID_XXXXXX, m_Slider);则控件是不会动的.关联办法:在控件上右键, 然后选择添加变量, 当然, 后面的变量名称为m_Slider, 确定.运行后即可.为什么需要关联呢?因为在一个界面中, 可能有很多的相同的控件. 此时, 控件变量需要有一个对应关系. 变量A对应控件A时, 控件B不会受影响. 或者说: 对于计算机软件而言, 不可以存在多义性, 变量对应一个控件, 否则, 控件将不会响应变量的变化.

关于MFC中Slider(滑动)控件的使用

可能没有关联.如果在CPP中没有找到:DDX_Control(pDX,ID_XXXXXX,m_Slider);则控件是不会动的.关联办法:在控件上右键,然后选择添加变量,当然,后面的变量名称为m_Slider,确定.运行后即可.为什么需要关联呢?因为在一个界面中,可能有很多的相同的控件.此时,控件变量需要有一个对应关系.变量A对应控件A时,控件B不会受影响.或者说:对于计算机软件而言,不可以存在多义性,变量对应一个控件,否则,控件将不会响应变量的变化.

MFC 怎么用 Timer

比如是MFC的DIALOG程序,在DIALOG的BOOL CXXXDlg::OnInitDialog() 函数中加入{ SetTimer(1,1000,NULL); //其中第一个参数是定时器的序号,第二个是间隔多长时间,1000是一秒,第三个是回调函数,如果为NULL,就是用默认的回调函数OnTimer}设置好以后,右键点CxxxxDilog类,然后加入消息响应,添加WM_TIMER,这样就生成了OnTimer函数,在OnTimer里你就可以进行你的操作了,比如你说的在EDIT中显示当前系统时间,加入EDIT的ID为IDC_EDIT1,加入你通过ClassWizard绑定了CString变量 m_stredit1,那么在OnTimer中如下写:void CAVIPlayerDlg::OnTimer(UINT nIDEvent) { //获取当前系统时间 CTime tm = CTime::GetCurrentTime(); m_stredit1.Format("%04d-%02d-%02d %02d:%02d:%02d",tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond()); UpdateData(FALSE); CDialog::OnTimer(nIDEvent);}

变形金刚玩具中的 mfc mp tfs 是什么意思??

据我所知没有mfc和tfs,只有tfc,是中国第三方厂家的名字,主要产品有大力神和大无畏,mp,全称Master piece是官方生产的最还原g1动画的玩具,玩具的价格也很贵。

TP AP MP,TC AC MC,TFC TVC,AVC AFC,MFC MVC,STC SAC SMC,LTC LAC SMC在西方经济学中分别代表些?

T- total 总的; A-average 平均 ; M-margin 边际; P-production 产量; C-cost 成本;F- fixed 固定; V-variable 可变;S- short 短期; L- long 长期;总产量,平均产量,边际产量总成本,平均成本,边际成本总固定成本,总可变成本平均可变成本,平均固定成本边际固定成本,边际可变成本短期总成本,短期平均成本,短期边际成本长期总成本,长期平均成本,长期边际成本应该都是 微观经济学 生产函数 那一章的概念

MFC中,为什么创建类对象以后,有时要调用Creat()函数,有时却不用 呢?

没有用Creat()函数是因为你用ClassWizard生成了比如你在界面上画了一个CButton,然后双击它编写代码,这个ClassWizard自动帮你生成了Create(),并不是没有这个函数,只是你看不见.果然你自己新建一个继承CButton类,这样就要手动的调用Create();

mfc140u.dll 丢失

Dll,文件丢失,你只需要去下载一个小软件,叫dll修复工具,希望可以帮到你

mfc 怎么修改 exe执行文件名

命令行也可以,但是对不熟悉的人是有点抓瞎,建议你建立一个工程,然后在工程项目内编辑资源,删除不想要的icon,添加自己的就行了

如何用MFC从MYSQL中读取数据

//下面的代码是一个实现C++连接MYSQL数据库的很好的例子//这里用了建表,插入,检索,删表等常用功能//我用VC++6.0生成,已经成功连接了。//在VC++6.0中要想把做一下两步准备工作才可以。//(1)Tools->Options->Directories->Include files中添加C:Program FilesMySQLMySQL Server 6.0include//(2)Tools->Options->Directories->Library files中添加C:Program FilesMySQLMySQL Server 6.0libopt//其实就是将头文件和库文件包含进来//我觉得这个例子写的很好,再结合自己的试验,特地介绍给大家! #include <winsock.h>#include <iostream>#include <string>#include <mysql.h>using namespace std; #pragma comment(lib, "ws2_32.lib")#pragma comment(lib, "libmysql.lib") //单步执行,不想单步执行就注释掉#define STEPBYSTEP int main() { cout << "****************************************" << endl; #ifdef STEPBYSTEP system("pause");#endif //必备的一个数据结构 MYSQL mydata; //初始化数据库 if (0 == mysql_library_init(0, NULL, NULL)) { cout << "mysql_library_init() succeed" << endl; } else { cout << "mysql_library_init() failed" << endl; return -1; } #ifdef STEPBYSTEP system("pause");#endif //初始化数据结构 if (NULL != mysql_init(&mydata)) { cout << "mysql_init() succeed" << endl; } else { cout << "mysql_init() failed" << endl; return -1; } #ifdef STEPBYSTEP system("pause");#endif //在连接数据库之前,设置额外的连接选项 //可以设置的选项很多,这里设置字符集,否则无法处理中文 if (0 == mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "gbk")) { cout << "mysql_options() succeed" << endl; } else { cout << "mysql_options() failed" << endl; return -1; } #ifdef STEPBYSTEP system("pause");#endif //连接数据库 if (NULL != mysql_real_connect(&mydata, "localhost", "root", "test", "test", 3306, NULL, 0)) //这里的地址,用户名,密码,端口可以根据自己本地的情况更改 { cout << "mysql_real_connect() succeed" << endl; } else { cout << "mysql_real_connect() failed" << endl; return -1; } #ifdef STEPBYSTEP system("pause");#endif //sql字符串 string sqlstr; //创建一个表 sqlstr = "CREATE TABLE IF NOT EXISTS user_info"; sqlstr += "("; sqlstr += "user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT "Unique User ID","; sqlstr += "user_name VARCHAR(100) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NULL COMMENT "Name Of User","; sqlstr += "user_second_sum INT UNSIGNED NOT NULL DEFAULT 0 COMMENT "The Summation Of Using Time""; sqlstr += ");"; if (0 == mysql_query(&mydata, sqlstr.c_str())) { cout << "mysql_query() create table succeed" << endl; } else { cout << "mysql_query() create table failed" << endl; mysql_close(&mydata); return -1; } #ifdef STEPBYSTEP system("pause");#endif //向表中插入数据 sqlstr = "INSERT INTO user_info(user_name) VALUES("公司名称"),("一级部门"),("二级部门"),("开发小组"),("姓名");"; if (0 == mysql_query(&mydata, sqlstr.c_str())) { cout << "mysql_query() insert data succeed" << endl; } else { cout << "mysql_query() insert data failed" << endl; mysql_close(&mydata); return -1; } #ifdef STEPBYSTEP system("pause");#endif //显示刚才插入的数据 sqlstr = "SELECT user_id,user_name,user_second_sum FROM user_info"; MYSQL_RES *result = NULL; if (0 == mysql_query(&mydata, sqlstr.c_str())) { cout << "mysql_query() select data succeed" << endl; //一次性取得数据集 result = mysql_store_result(&mydata); //取得并打印行数 int rowcount = mysql_num_rows(result); cout << "row count: " << rowcount << endl; //取得并打印各字段的名称 unsigned int fieldcount = mysql_num_fields(result); MYSQL_FIELD *field = NULL; for (unsigned int i = 0; i < fieldcount; i++) { field = mysql_fetch_field_direct(result, i); cout << field->name << " "; } cout << endl; //打印各行 MYSQL_ROW row = NULL; row = mysql_fetch_row(result); while (NULL != row) { for (int i = 0; i < fieldcount; i++) { cout << row[i] << " "; } cout << endl; row = mysql_fetch_row(result); } } else { cout << "mysql_query() select data failed" << endl; mysql_close(&mydata); return -1; } #ifdef STEPBYSTEP system("pause");#endif //删除刚才建的表 sqlstr = "DROP TABLE user_info"; if (0 == mysql_query(&mydata, sqlstr.c_str())) { cout << "mysql_query() drop table succeed" << endl; } else { cout << "mysql_query() drop table failed" << endl; mysql_close(&mydata); return -1; } mysql_free_result(result); mysql_close(&mydata); mysql_server_end(); system("pause"); return 0;}

MFC怎么使自己的程序开机启动。

将这个exe放到启动文件夹里。

MFC(exe)程序为什么第一次compile显示错误,pch文件找不到,build后就可以消除错误?

因为你第一次编译文件是。没有在相应的debug目录下生成*.pch文件。所以显示编译错误,而当你运行的时间,就有这个文件生成了,所以才编译成功,vc本身的缺陷,所以当你第一次生成mfc程序是,先运行F5.然后编译才能成功。求采纳

如何在MFC单文档里添加按钮?

CreateWIndow

MFC 通过一个对话框的push button改变另一个对话框的内容

在有push button的界面显示时,能看到另一个对话框的列表控件吗?能的话:就是通过对话框指针直接向ListCtrl插入或者改写内容。不能的话,那就把需要修改的内容记录到变量中或数组中,在另一个对话框的列表控件显示时,进行显示。你现在需要的了解下指针的使用。

在MFC中,怎么把CString写入文件???

可以写个配置文件来保存,而且还可以随时调用

MFC 请教怎样设置STATIC TEXT控件的字体大小和颜色

设置字体:STASTIC TEXT 的ID改为IDC_STATIC1或其他唯一的IDLOGFONT lf; //逻辑字体结构 ::ZeroMemory(&lf,sizeof(lf)); lf.lfHeight = 40; lf.lfWidth= 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_BOLD; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut= FALSE; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; m_font1.CreateFontIndirect(&lf); GetDlgItem(IDC_STATIC1)->SetFont(&m_font1);设置颜色,为窗体添加OnCtlColor()函数,函数内填写下面代码HBRUSH CInitial::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if (pWnd->GetDlgCtrlID() == IDC_STATIC1) { pDC->SetTextColor(RGB(255,0,0)); //蓝色 } // TODO: Return a different brush if the default is not desired return hbr;}若满意请及时采纳,谢谢

MFC 请教怎样设置STATIC TEXT控件的字体大小和颜色

必须自己改变画笔画刷的颜色值,以及FONT 确实一点都不好用,我也觉得。 比起其他语言确实麻烦了许多。 如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

兄弟MFC-7420显示Toner Low后还能用多久

这个提示是说你墨粉不足,如果你不太常用的话,可以吧墨粉带硒鼓一起左右大力摇晃壹下(主要是粉摇匀壹点)至于还能打印多久,这个不是很清楚了 但你可以按“功能键”再按数字键 “5”打印出一份自检报告。右下有硒鼓寿命显示,并有你打印情况的显示。 你墨粉的型号是TN-8050吧 技术指标是A4大小 5%的文字覆盖率 是2200张左右吧,有点忘记了。

MFC 关于undeclared identifier

在Audio.h里面加入 CString m_strFilePath;

急求井字游戏的编程源代码(MFC格式)

“井字棋”游戏(又叫“三子棋”),是一款十分经典的益智小游戏,想必很多玩家都有玩过。“井字棋”的棋盘很简单,是一个3×3的格子,很像中国文字中的“井”字,所以得名“井字棋”。“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。井字棋(英文名Tic-Tac-Toe)井字棋的出现年代估计已不可考,西方人认为这是由古罗马人发明的;但我们中国人认为,既然咱们都发明了围棋、五子棋,那发明个把井字棋自然是不在话下。这些纯粹是口舌之争了,暂且不提。想起小时候上课喜欢玩井字棋,只要一张草稿纸、一支笔、同桌两人就可以玩了。上体育课,也可以拿着树枝在沙坑里玩。但一直感觉这游戏太简单了,后来接触了五子棋,着迷了一阵,但水平总是很差,便也不玩了。一字棋游戏极小极大分析法 设有九个空格,由MAX,MIN二人对弈,轮到谁走棋谁就往空格上放一只自己的棋子,谁先使自己的棋子构成“三子成一线”(同一行或列或对角线全是某人的棋子),谁就取得了胜利。 用叉号表示MAX,用圆圈代表MIN。 比如右图中就是MIN取胜的棋局。 为了不致于生成太大的博弈树,假设每次仅扩展两层。估价函数定义如下: 设棋局为P,估价函数为e(P)。 (1) 若P对任何一方来说都不是获胜的位置,则e(P)=e(那些仍为MAX空着的完全的行、列或对角线的总数)-e(那些仍为MIN空着的完全的行、列或对角线的总数) (2) 若P是MAX必胜的棋局,则e(P)=+∞。 (3) 若P是B必胜的棋局,则e(P)=-∞。 比如P如右图示,则e(P)=6-4=2 要注意利用棋盘位置的对称性,在生成后继节点的位置时,下列博弈结局 都是相同的棋局(在博弈中,一宇棋的分枝系数比较小起初是由于对称性,而后是由于棋盘上未布子的空格减少所致)。图3.15画出了经过两层搜索生成的博弈树,静态估值记在端节点下面,倒推值记在圆圈内。 由于右图所示位置具有最大的倒推值,它应当选取为MAX的第一步(正好是MAX的最好的优先走步)。 现在我们假设MAX走了这一步,而MIN的回步是直接在X上方的空格里放上一个圆圈(对MAX来说这是一步坏棋,他一定没有采用好的搜索策略)。下一步,MAX又在新的格局下搜索两层,产生如图3.16所示的搜索图。 现在图中MAX有两个可能“最好的”优先走步,假设MAX走了图上指明的那一步。而MIN为了避免立即败北被迫走了另一步,从而产生如下棋局:MAX再次搜索,产生如图3.17所示的树。 在这棵树中某些端节点(例如其中一个标记着A)代表MIN获胜,因此它们的估值为—∞。当这些估值被倒推回去时,可看到MAX的最好的也是唯一能使他避免立即失败的一个走步。现在,MIN可以看出MAX必然在他的下一走步中获胜,因此,MIN只好认输。 按极大极小算法编程下一字棋的演示(右图,可以点击操作)... 我们就利用Visual Basic编写一个“井字棋”的小游戏。【设计思路】 首先,我们要知道,“井字棋”游戏是一款典型的棋类游戏,游戏时一方式是电脑,另一方是玩家。所以,这类游戏在开始时有两种方式:一种是玩家先走;另一种是电脑先走。这是我们要考虑的第一个问题。 其次,由于与玩家对战的是计算机,所以我们要编写一个过程(Chuqi),它可以使程序模拟人的思维与人下棋(其实就是“人工智能”的体现),这个Chuqi过程也是本游戏软件的关键。此外,我们还要编写两个过程(Lianxian和Shuying),Lianxian过程用来时刻判断棋盘中是否有三个棋子连成一线;Shuying过程用来判断如果有三个棋子连成一线,是哪一方连成一线的,即判断哪一方获胜。 以上几个问题就是该“井字棋”游戏实现的关键思路。....

MFC 画图问题

要覆盖图像只要在原来的图像所在位置画背景就可以了,比如在整个客户区画背景,就不用记录上一副图像的尺寸和位置。

MFC检索不到对话框控件怎么回事应该要怎么解决?

在resource里的dialog里没找到?

MFC对话框线程传入指针操作UpdateData 崩溃

建议跟踪看一看。

MFC对话框线程传入指针操作UpdateData 崩溃

建议跟踪看一看。

在mfc中以基于单文档里画了个坐标并显示需要的图形,请问怎样修改使那个坐标随着窗口大小的改变而改变呢?

第一个问题,例子的 加入void CCoordinatesTestView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); m_Coordinates.SetCoordinates(cx/2,-1*(cy/2)); }这样就是居中了,至于你要设到其他位置,就自己调整。,但是Y要把它×-1来翻转坐标第二个问题,你可以做一个自己的包装类来容纳你所有的控件,打一个比方,你有3个控件一个按钮CButton mButtonFirst;一个文本CEdit mEditSecond;一个进度条CProgress mProgressThird;然后你写一个类class ControlsWrap{ //这个在OnSize(UINT nType, int cx, int cy) 里调用,把窗口大小传进来 public void rePosControls(int cx,int cy) { _rePosButtonFirst(cx,cy); _rePosEditSecond(cx,cy); _rePosProgressThird(cx,cy); } private void _rePosButtonFirst(int cx,int cy) { // 根据窗口大小调整你想要的按钮位置 } private void _rePosEditSecond(int cx,int cy) { // 根据窗口大小调整你想要的编辑框位置 } private void _rePosProgressThird(int cx,int cy) { // 根据窗口大小调整你想要的进度条位置 }}当然这种办法很土,但是够用了,要是自己设计一种布局可以更方便,就像Java的界面那样。

VC++MFC函数中Assert疑问?

Assert用于论证表达式是否为空(NULL);

一段QQ即时聊天的MFC代码

QQ爱

问:mfc中如何彻底删除控件

一、先删除相应的控件,这个选中,直接Delete键,然后去源文件找到相应的控件程序,选中右键删除即可,然后,去头文件里删除相应的控件声明和你定义的全局变量,像inti;doublej等,看你怎么定义的了。就好啦

MFC中pDC->Ellipse画同心圆的问题

CRect Rect;GetClientRect(&Rect);int Maxx=Rect.right;int MaxY=Rect.bottom;pDC->SelectStockObject(NULL_BRUSH);//不使用画刷for(int i=1;i<=6;i++){ pDC->Ellipse (Maxx/2-10*i,MaxY/2-10*i,Maxx/2+10*i,MaxY/2+10*i);}pDC->Ellipse(Maxx/2-10*10,MaxY/2-10*10,Maxx/2+10*10,MaxY/2+10*10);使用画刷,则为填充圆,画大圆的时候,会把小圆覆盖不使用画刷,则为非填充圆

MFC里用MAPI发送邮件时如何设置CC。

MapiRecipDesc reci[1];定义一个元素的数组,这么简单的基础知识。。。后面的reci[1]访问越界。你还是好好去看看基础吧。没学行就学飞只会摔得更疼。

MFC resources LoadFailed 怎么办

资源ID正确吗?

MFC和CLR/C++有什么区别吗

MFC是微软对windows系统的API函数的封装,称微软基础类库,CLR是通用语言运行时,.net中指程序运行时,一个对其支持的平台。其实.net跟JAVA也就差不多了,但是什么机器都有一个所谓的JAVA虚拟机,而.net的Framwork一般要用户去安装。

mfc的listbox中怎么删除内容?

DeleteString(),删除指定索引的字符串.你先获得你要删除字符串的索引.

C++ MFC 中如何实现对一个txt文件的读,txt中有数据 0 1 2 3 4,都是用空格分开的这种

先全部读取到一个CString中,然后自己写拆分函数分开,用个系统函数strtok可以用用.

MFC列表框用AddString()后无显示内容!!!

应该要在函数中添加变量到控件函数UpdateData(FALSE)

C++ MFC combobox ResetContent()问题

对话框的OnClose吗?断点确认下OnClose是否执行了。对话框按确认或取消关闭一般不会调OnClose。CComboBox::SetMinVisibleItems

MFC中列表控件的DeleteAllItems()方法只能清空列表控件里显示的内容,不能清空第一行的列表的表头

清空框里的内容是调用Clear()方法

MFC ComBox ResetContent( )

Combo Box的style是不是设置成了drop list类型,改成Sample类型,就可以输入数据了。

MFC中 WinApp 的全局变量是怎么回事

  用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。  一、在应用程序类中定义  用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。  从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于很容易获得CxxxApp类的指针,所以可以在文档、视 图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用 “AfxGetApp()->成员”访问变量或函数。  例:  Test.h:(应用程序类头文件)  class CTestApp : public CWinApp + i; Q+ }  public:  int x; //全局变量  int f(int y); //全局函数 ) X s+ s" N+ U  …………  Test.cpp:(应用程序类程序文件)  int CTestApp::f(int y) //全局函数定义  {  定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():  void CTestView::xyz()  {  CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针 /  app  int z = app->f(1); //访问函数f() 0 R,  }  这样,变量x和函数f()可以视作为全局的  用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。  二、用静态变量和静态函数实现  很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。  静态变量和静态函数有如下性质:  若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。  若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。  利用这个性质实现的全局变量和函数使用起来很方便。  值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。  例:  1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类  单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。  2、包含公用类的头文件,使各个类都能访问它  CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。  Test.h:(应用程序类头文件))  #include "Public.h" //包含公用类头文件  class CTestApp : public CWinApp  {  …………  };  3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化  Public.h:(公用类头文件)  class CPublic  {  public:  CPublic();  virtual ~CPublic();  public:  static int x; //全局变量 % v  static int time; //全局变量 #  static int f(int y); //全局函数  }  在公用类中对静态变量进行初始化和定义函数体:  Public.cpp:(公用类程序文件)  int CPublic::x = 0; //初始化全局变量  int CPublic::time; //定义全局变量  CPublic::CPublic()  {  }  CPublic::~CPublic()  {  }  int CPublic::f(int y) //全局函数,这里不要再加static  { y++; 4  return y;  } 3 O2 V% Z6 r+ r( k! L  4、全局量的使用  使用变量:CPublic::变量名6 H)  使用函数:CPublic::函数()  如在视图的某函数中访问变量x和函数f():  void CTestView::xyz()  {  CPublic::x = 0; //访问变量x;  CPublic::time = CPublic::f(1); //访问函数f()"  …………  }  在其它类中访问x、time和f()的方法与此相同。  5、几点注意:  ① 由于静态量可独立于类存在,不需要生成CPublic类的实例。  ② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。  ③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。  这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。  总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让吃足苦头。

在MFC中如何定义全局变量,如何引用它?

用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。 一、在应用程序类中定义  用MFC生成的工程中都有一个名为CxxxApp的类,它派生于CWinApp类。这个类主要进行程序的初始化,生成文档、视图对象等工作。我们可以把需要全局访问的变量和函数定义为这个类的成员变量和成员函数,就可以实现全局访问了。  从严格意义上讲,这种变量和函数并不是全局的,因为它仍然只是类中的成员,只是由于我们很容易获得CxxxApp类的指针,所以我们可以在文档、视图、对话框以及各种自定义类中访问到它们,达到与全局变量类似的效果。访问时用函数“AfxGetApp()”获得CxxxApp类的指针,用“AfxGetApp()->成员”访问变量或函数。  例:  Test.h:(应用程序类头文件)class CTestApp : public CWinApp {   public:    int x; //全局变量   int f(int y); //全局函数    …………};  Test.cpp:(应用程序类程序文件)int CTestApp::f(int y) //全局函数定义 {   y++;   return y; }  定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():void CTestView::xyz(){   CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针   app->x = 0; //访问变量x   int z = app->f(1); //访问函数f()   …………}  这样,变量x和函数f()可以视作为全局的。  用这种方法实现的全局变量和全局函数虽比较简单,但也有缺点,一是访问不太方便,每次都需要获取应用程序类的指针;再就是把一些与应用程序类本身无关的变量和函数放在里面,使这个类看上去怪怪的,破坏了类的封装。   二、用静态变量和静态函数实现  很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。  静态变量和静态函数有如下性质:  若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。  若在一个类中用关键字static声明函数,该函数可以用“类名::函数名”方式访问,无需引用该类的实例,甚至这个类的实例可以不存在。  利用这个性质实现的全局变量和函数使用起来很方便。  值得注意的是,全局变量和全局函数最好集中封装,不要在文档、视图等类内部定义,这样用起来才有全局的感觉。  例:  1、添加一个没有基类的新类,设类名起为CPublic,姑且称之为公用类  单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。  2、包含公用类的头文件,使各个类都能访问它  CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。  Test.h:(应用程序类头文件)#include "Public.h" //包含公用类头文件class CTestApp : public CWinApp{ ………… };  3、在公用类中定义全局变量和全局函数,均使用static修饰,静态变量还必须在类外定义和初始化  Public.h:(公用类头文件)class CPublic{public: CPublic();virtual ~CPublic();public:static int x; //全局变量 static int time; //全局变量 static int f(int y); //全局函数 ………… }  在公用类中对静态变量进行初始化和定义函数体:  Public.cpp:(公用类程序文件)int CPublic::x = 0; //初始化全局变量 int CPublic::time; //定义全局变量 CPublic::CPublic() { } CPublic::~CPublic() { } int CPublic::f(int y) //全局函数,这里不要再加static { y++; return y; }  4、全局量的使用  使用变量:CPublic::变量名  使用函数:CPublic::函数()  如在视图的某函数中访问变量x和函数f():void CTestView::xyz(){ CPublic::x = 0; //访问变量xCPublic::time = CPublic::f(1); //访问函数f()…………}  在其它类中访问x、time和f()的方法与此相同。  5、几点注意:  ① 由于静态量可独立于类存在,不需要生成CPublic类的实例。  ② 静态数据成员的定义和初始化必须在类外进行,如例中x的初始化;变量time虽然没有初始化,但也必须在类外进行定义。由于没有生成CPublic类的实例,所以它的构造函数和析构函数都不会被执行,在里面做什么工作都没有什么意义。  ③ 如果静态函数需要访问CPublic类内的变量,这些变量也必须为静态的。因为非静态量在不生成实例时都不会存在。 如:class CPublic { public: int x; //内部变量static int f(int y) //全局函数{ x++; return x; }; ………… };  这里x虽为类内成员,但如果不生成CPublic类的实例,就会出现函数f()存在,而变量x不存在的问题。  总之,用没有实例的类管理全局量是一个不错的选择,它具有集中管理,使用方便的好处。当然,除非特别必要,全局量还是少用为好,一个好的编程者决不会随意滥用全局量的,一个封装做得不好的程序,在修改维护时会让你吃足苦头。

MFC中关于CString和char*之间的问题,为什么都是不成功?

文件是能打开成功的

vc++ mfc 剪贴板操作教程

本文主要介绍了VC++/MFC中如下内容的剪贴板操作:1、文本内容的操作2、WMF数据的操作3、位图的操作4、设置使用自定义格式5、感知剪贴板内容的改变6、自动将数据粘贴到另一应用程序窗口一、文本内容的操作下面的代码示范了如何将文本内容复制到剪贴板(Unicode编码的先转化为ASCII):CString source;//文本内容保存在source变量中if( OpenClipboard() ){HGLOBAL clipbuffer;char * buffer;EmptyClipboard();clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1);buffer = (char*)GlobalLock(clipbuffer);strcpy(buffer, LPCSTR(source));GlobalUnlock(clipbuffer);SetClipboardData(CF_TEXT,clipbuffer);CloseClipboard();}下面的代码显示了如何从剪贴板上获得文本内容:char * buffer = NULL;//打开剪贴板CString fromClipboard;if ( OpenClipboard() ){HANDLE hData = GetClipboardData(CF_TEXT);char * buffer = (char*)GlobalLock(hData);fromClipboard = buffer;GlobalUnlock(hData);CloseClipboard();}二、WMF数据的操作在剪贴板上读写图象数据是非常有用的功能,并且实现起来也很简单。下面的代码显示了如何将扩展图元文件复制到剪贴板:if(OpenClipboard());{EmptyClipboard();//创建图元文件DCCMetaFileDC * cDC = new CMetaFileDC();cDC-CreateEnhanced(GetDC(),NULL,NULL,"the_name");//调用绘图例程//关闭CMetafileDC并获得它的句柄HENHMETAFILE handle = cDC-CloseEnhanced();//复制到剪贴板SetClipBoardData(CF_ENHMETAFILE,handle);CloseClipboard();//删除dcdelete cDC;}下面的代码演示了从剪贴板获得图元文件并将其绘制到client DC上:if(OpenClipboard()){//获得剪贴板数据HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);//显示CClientDC dc(this);CRect client(0,0,200,200);dc.PlayMetaFile(handle,client);//关闭剪贴板CloseClipboard();}三、位图的操作位图的操作稍微复杂一点,下面这个例子显示了如何在剪贴板保存位图:if(OpenClipboard()){EmptyClipboard();CBitmap * junk = new CBitmap();CClientDC cdc(this);CDC dc;dc.CreateCompatibleDC(cdc);CRect client(0,0,200,200);junk-CreateCompatibleBitmap(cdc,client.Width(),client.Height());dc.SelectObject(junk);DrawImage(dc,CString("Bitmap"));//复制数据到剪贴板SetClipboardData(CF_BITMAP,junk-m_hObject);CloseClipboard();delete junk;}下面的代码显示了如何从剪贴板上获得位图数据:if(OpenClipboard()){//获得剪贴板数据HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);CBitmap * bm = CBitmap::FromHandle(handle);CClientDC cdc(this);CDC dc;dc.CreateCompatibleDC(cdc);dc.SelectObject(bm);cdc.BitBlt(0,0,200,200,dc,0,0,SRCCOPY);CloseClipboard();}四、设置并使用自定义格式使用RegisterClipboardFormat()函数,可以复制和粘贴任何你需要的数据类型。比如我们有以下一个数据类型:struct MyFormatData{long val1;int val2;};我们要把它复制到剪贴板,可以使用如下的代码:UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");if(OpenClipboard()){MyFormatData data;data.val1 = 100;data.val2 = 200;HGLOBAL clipbuffer;EmptyClipboard();clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);//保存到内存*buffer = data;//保存到剪贴板GlobalUnlock(clipbuffer);SetClipboardData(format,clipbuffer);CloseClipboard();}读取数据使用以下代码:UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");MyFormatData data;if(Openclipboard()){HANDLE hData =GetClipboardData(format);MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);data = *buffer;GlobalUnlock(hData);CloseClipboard();}五、感知剪贴板内容的改变通过Windows消息可以感知剪贴板内容是否发生改变,代码如下://In your initialization code call:SetClipboardViewer(); //将我们的程序添加到剪贴板观察链//In your message map add:ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle//Which is declared as:afx_msg void OnClipChange();Finally implement:void CDetectClipboardChangeDlg::OnClipChange(){CTime time = CTime::GetCurrentTime();SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));DisplayClipboardText();}六、自动将数据粘贴到另一应用程序窗口只需获得相应窗口的句柄,并发送一个消息就可以了

mfc单文档删除掉自动生成的mene后出现创建空文档失败

在App的InitInstance()中,建立文档时需要资源:IDR_MAINFRAME CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,//这里包含多个资源的ID,你看看工程同名的 ...);AddDocTemplate(pDocTemplate);具体的你可以自己挖源码看你要去掉菜单可以在下面使用 m_pMainWnd->SetMenu(NULL);或者取得框架指针AfxGetMainFrame()->SetMenu(NULL);

C++,MFC 快速清理malloc申请的内存(400M)

两个if判断语句中的相等改成==之后free(),指针赋值NULL就可以了啊free(buff);是释放指针buff所指向的内存,你的程序在free之前就已经修改了buff=NULL,怎么会释放成功呢?malloc申请的内存由free释放,new申请的内存由delete释放

如何在一个非MFC应用程序(如WIN32控制台编程)中使用MFC提供的类,例如CObject,要做哪些工作

包含相应的头文件试试

在MFC编程中有个概念叫“设备上下文”,究竟什么才算是设备上下文呢? 请高手帮忙,谢谢了

设备上下文 =Device ContextDevice 就是关联的设备. 编程时和硬件或软件环境交互必须的对象. 获取他,访问他,修改他,就等于操作了硬件或软件.

在MFC中如何将通过Serialize()将数据正确的写入文件

直接重载这个函数,采用文档和视结构的话,为了保存数据,这个函数是必须要进行重载的,写成你自己需要的数据保存方式,比如说保存成二进制或者是文本文件最简单的方法你就是尝试一下流操作符“《”啊,用这个就可以把数据写入到文件中,默认的话是文本格式,如果保存的是字符串的话,你可以用记事本打开来看的,下面是MSDN中的例子:void CAge::Serialize( CArchive& ar ) { CObject::Serialize( ar ); if( ar.IsStoring() ) //这对应存储 ar << m_years; else //这对应读取 ar >> m_years; }

请教大虾们:关于MFC Serialize()函数的使用机制,急!有分~

CObjectCObject为Microsoft基础类库中主要的基类。它不仅用作库类,例如CFile和CObList的根,而且也是自己编写的类的根。CObject类提供了基本的服务,其中包括: · 支持串行化 · 运行类信息 · 对象诊断输出 · 与收集类兼容 注意:CObject类不支持多继承。派生的类仅仅拥有一个CObject基类,并且CObject在等级体系中必须位于最左边。不过,它也允许在多继承分支的右边有其结构及非CObject派生类。如果在类的执行与声明过程中使用了可选的宏,那么你将发现CObject派生的主要优点。第一层次的宏,DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,允许在等级体系中运行时访问类名及位置。这样,将允许依次地进行有意义的诊断转储。第二层次的宏,DECLARE_SERIAL和IMPLEMENT_SERIAL,包含了第一层次宏的所有功能,并且能够使对象到“档案”有效地串行化。如果要了解有关通常条件下派生的Microsoft基础类和C++类,以及如何使用CObject类的更多信息,请参阅联机文档“Visual C++程序员指南”中的“CObject类主题”及“串行化(对象永久化)”。#include <afx.h>CObject类的成员构造函数 CObject 缺省的构造函数 CObject 拷贝构造函数 operator new 特别的new操作 operator delete 特别的delete操作 operator = 赋值操作 诊断 AssertValid 证实该对象的完整性 Dump 进行该对象的诊断转储 串行化 IsSerializable 测试该对象是否被串行化 Serialize 从档案文件中装载或向档案文件中存储某对象 多面性 GetRuntimeClass 返回对应该对象类的CRuntimeClass结构 IsKindOf 测试该对象是否与指定类相关联 CObject::Serializevirtual void Serialize( CArchive& ar ); throw( CMemoryException ); throw( CArchiveException ); throw( CFileException );参数: ar 被串行化的CArchive对象。 说明:从档案文件中读取该对象或向档案文件中写入该对象。必须为希望串行化的每个类覆盖Serialize。被覆盖的Serialize首先必须调用基类的Serialize函数。在类的声明中必须使用DECLARE_SERIAL宏,并且在类的执行过程中也必须使用IMPLEMENT_SERIAL宏。使用CArchive::IsLoading或CArchive::IsStoring函数,用于决定是否装载或存储了档案文件。通过CArchive::ReadObject和CArchive::WriteObject来调用Serialize函数。这些函数与CArchive插入操作符(<<)和抽出操作符(>>)相关联。如果要了解有关串行化的例子,请参阅联机文档“Visual C++程序员指南” 中的“串行化(对象永久化)”。示例:请参阅ObList::CObList,了解所有CObject示例中使用的CAge类。// example for CObject::Serializevoid CAge::Serialize( CArchive& ar ){ CObject::Serialize( ar ); if( ar.IsStoring() ) ar << m_years; else ar >> m_years;} CArchive::IsStoringBOOL IsStorng( ) const;返回值:如果正在存储归档文件,则返回非零值,否则为0。说明:确定是否正在存储归档文件。这个函数由归档文件类的Serialize函数调用。如果归档文件的IsStoring状态为非零,则它的IsLoading状态为0,反之亦然。示例:int i;extern CArchive ar;if(ar.IsStoring( )) ar< else ar>>i;请参阅:CArchive::IsLoading
 首页 上一页  1 2 3