List.h /* Link list declaration. */ #ifndef _LIST_H_ #define _LIST_H_ #include <windows.h> #include <commctrl.h> #include "neste.h" #define IDMF_OPEN 9001 #define IDMF_SAVE 9002 #define IDMF_EXIT 9003 #define IDMF_INDEX 9004 #define IDMF_ABOUT 9005 #define IDMF_SORT 9006 typedef struct tagNode{ ElemType data; // data area struct tagNode *pNext; // point to next node }Node; class CList{ public: CList(); CList& operator=(const CList& SourceList); int GetLength(); int GetPosition(ElemType elem); bool Insert(int iPos, ElemType elem); bool Delete(int iPos, ElemType &elem); bool GetElem(int iPos, ElemType &elem); bool SetElem(int iPos, ElemType elem); bool isEmpty(); bool Clear(); bool Sort(HWND); void Traverse(); void VisitData(ElemType elem); ~CList(); private: Node head; int iLength; }; #endif // _LIST_H_ List.cpp /* Link list definitions. */ #include "list.h" extern char* szAppName; /* Parameter : none Return : none Description : class CList constructor */ CList::CList() { //cout<<"link list constructor"<<endl; head.pNext = NULL; iLength = 0; } // constructor /* Parameter : const CList& Return : CList & Description : overload operator= to do assign */ CList & CList::operator =(const CList & SourceList) { return *this; } // overload operator= /* Parameter : int, ElemType Return : if successed return true or false Description : Insert an element in the destination position */ bool CList::Insert(int iPos, ElemType elem) { int j = 0; Node *pNext = &head; Node *pTemp = new Node; while (pNext && j < iPos-1) { // Search the position pNext = pNext->pNext; j++; } if (!pNext || j > iPos - 1 ) { // less than or more than list length //cout<<"less than or more than list length!"<<endl; MessageBox(NULL, " less than or more than list length... ", "Message", MB_OK|MB_ICONWARNING); return false; } // insert an element to the list pTemp->data = elem; pTemp->pNext = pNext->pNext; pNext->pNext = pTemp; iLength++; return true; } // Insert /* Parameter : int, ElemType Return : true or false Description : Delete an element in the destination position */ bool CList::Delete(int iPos, ElemType &elem) { int j = 0; Node *p = &head; while (p && j < iPos - 1) { // search the position p = p->pNext; j++; } if (!p || j > iPos - 1) { MessageBox(NULL, " less than or more than list length... ", "Message", MB_OK|MB_ICONWARNING); return false; } // delete the element elem = p->pNext->data; p->pNext = p->pNext->pNext; iLength--; return true; } // Delete /* Parameter : ElemType Return : void Description : Output the element data */ void CList::VisitData(ElemType elem) { } // VisitData /* Parameter : ElemType Return : int Description : */ int CList::GetPosition(ElemType elem) { return 1; } // GetPosition /* Parameter : ElemType Return : int Description : Get the element in position iPos */ bool CList::GetElem(int iPos, ElemType &elem) { int j = 0; Node *p = head.pNext; if (iPos <1 || iPos > iLength) { MessageBox(NULL, "wrong position in GetElem function... ", "Message", MB_OK|MB_ICONWARNING); return false; } while (p && j < iPos - 1) { // search the position p = p->pNext; j++; } if (!p || j > iPos - 1) { MessageBox(NULL, " less than or more than list length... ", "Message", MB_OK|MB_ICONWARNING); return false; } elem = p->data; return true; } // GetElem /* Parameter : int , ElemType Return : true or false Description : Set the element of position iPos */ bool CList::SetElem(int iPos, ElemType elem) { int j = 0; Node *p = head.pNext; if (iPos <1 || iPos > iLength) { MessageBox(NULL, "wrong position in SetElem function... ", szAppName, MB_OK|MB_ICONWARNING); return false; } while (p && j < iPos - 1) { // search the position p = p->pNext; j++; } if (!p || j > iPos - 1) { MessageBox(NULL, " less than or more than list length... ", "Message", MB_OK|MB_ICONWARNING); return false; } p->data = elem; return true; } // SetElem /* Parameter : HWND Return : bool Description : Use insert method to sort the list according to dimension */ bool CList::Sort(HWND hWnd) { ElemType Current; ElemType Previous; if (isEmpty() ) { MessageBox(hWnd, " There is no record in the list... ", szAppName, MB_OK|MB_ICONWARNING); return false; } else { for (int i=1; i<= GetLength(); ++i) { GetElem(i, Current); for (int j=i; j>1; --j) { GetElem(j-1, Previous); if (Current.Dimension < Previous.Dimension) { SetElem(j, Previous); SetElem(j-1, Current); } } } } //MessageBox(hWnd, " Fihish sort the list according to dimension ... ", szAppName, MB_OK); return true; } // Sort /* Parameter : none Return : void Description : Output the list */ void CList::Traverse() { Node *p = head.pNext; while (p) { VisitData(p->data); p = p->pNext; } } // Traverse /* Parameter : none Return : link list current length Description : get list current length */ int CList::GetLength() { return iLength; } //GetLength /* Parameter : none Return : true or false Description : if list is empty return true or false */ bool CList::isEmpty() { if (iLength) return false; else return true; } // isEmpty /* Parameter : none Return : true or false Description : clear the list */ bool CList::Clear() { Node *p = new Node; Node *q = new Node; p = head.pNext; while (p) { q = p->pNext; delete p; p = q; iLength--; } head.pNext = NULL; return true; } // Clear /* Parameter : none Return : none Description : class CList destructor */ CList::~CList() { //cout<<"link list destructor"<<endl; delete head.pNext; } // destructor Neset.h /* Neste structure declaration. */ #ifndef _NESTE_H_ #define _NESTE_H_ #include <string> #include <fstream> #include <iostream> using namespace std; typedef struct { string PartName; // 零件名 double Weight; // 质量 double xPos, yPos, zPos; // X,Y,Z string Panel; // Panel string Block; // block string Part; // string Type; // string Side; // int StockNumber; // string Quality; // string GPS1,GPS2,GPS3,GPS4; // string Ship; // 工程名 : STK string Ident; // string NestedOn; // double Area; // double CircLength; // double CircWidth; // double Thickness; // string Shape; // string Dimension; // double TotalLength; // double MouldedLength; // } ElemType; #endif //_NESTE_H_ Main.cpp //----------------------------------------------------------------------------- // Copyright (c) 2009 All rights reserved. // // File : Main.cpp // Author : eryar@163.com // Date : 2009-06-07 09:44 // // Version : 1.0v // Description : // //============================================================================= #include "list.h" CHAR *szAppName = "NestePro"; CHAR szBuffer[200]; bool ReadCSVFile(HWND hWnd, char *szFile, CList&); bool WriteFile(HWND hWnd, char *szFile, CList&); void UserMenu(HWND); void OpenCSVFile(HWND, CList&); void SaveCSVFile(HWND, CList&); void HandleMenu(HWND, WPARAM, CList&); void InsertItem(HWND, CList&); HWND CreateListView(HWND hWndParent, int iColumn); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd; MSG msg; WNDCLASS wClass; CHAR szClassName[10] = "CNestePro"; wClass.style = CS_VREDRAW|CS_HREDRAW; wClass.cbClsExtra = 0; wClass.cbWndExtra = 0; wClass.lpfnWndProc = WndProc; wClass.hInstance = hInstance; wClass.hIcon = LoadIcon(NULL,IDI_APPLICATION); wClass.hCursor = LoadCursor(NULL, IDC_ARROW); wClass.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wClass.lpszClassName = szClassName; wClass.lpszMenuName = NULL; if (!RegisterClass(&wClass) ) { MessageBox(NULL, "register window class failed! ", szAppName, MB_OK|MB_ICONWARNING); return 0; } hWnd = CreateWindow( szClassName, szAppName, WS_OVERLAPPEDWINDOW, //|WS_MINIMIZEBOX|WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } // LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { static CList NesteList; switch(Message) { case WM_CREATE: UserMenu(hWnd); CreateListView(hWnd, 5); break; case WM_SIZE: InsertItem(CreateListView(hWnd, 5), NesteList); break; case WM_COMMAND: HandleMenu(hWnd, wParam, NesteList); break; case WM_KEYDOWN: switch(wParam) { case VK_ESCAPE: if (MessageBox(hWnd, "Are you sure to quit? ", szAppName, MB_OKCANCEL|MB_ICONQUESTION) == IDOK) { PostQuitMessage(0); } break; } break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, Message, wParam, lParam); } // WndProc /* Parameter : HWND Return : none Description : */ void UserMenu(HWND hWnd) { HMENU hMenu, hSubMenu; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, IDMF_OPEN, "O&pen.."); AppendMenu(hSubMenu, MF_STRING, IDMF_SAVE, "S&ave.."); //AppendMenu(hSubMenu, MF_STRING, IDMF_SORT, "S&ort.."); AppendMenu(hSubMenu, MF_STRING, IDMF_EXIT, "E&xit"); AppendMenu(hMenu, MF_STRING|MF_POPUP, (UINT)hSubMenu, "&File"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, IDMF_INDEX, "&Index"); AppendMenu(hSubMenu, MF_STRING, IDMF_ABOUT, "A&bout"); AppendMenu(hMenu, MF_STRING|MF_POPUP, (UINT)hSubMenu, "&Help"); SetMenu(hWnd, hMenu); } // UserMenu /* Parameter : WPARAM Return : none Description : */ void HandleMenu(HWND hWnd, WPARAM wParam, CList& NesteList) { //static CList NesteList; switch (LOWORD(wParam) ) { case IDMF_OPEN: OpenCSVFile(hWnd, NesteList); NesteList.Sort(hWnd); InsertItem( CreateListView(hWnd, 6), NesteList); break; case IDMF_SAVE: if (NesteList.Sort(hWnd) ) { SaveCSVFile(hWnd, NesteList); } break; case IDMF_EXIT: if (MessageBox(hWnd, "Are you sure to quit? ", szAppName, MB_OKCANCEL|MB_ICONQUESTION) == IDOK) { PostMessage(hWnd, WM_CLOSE, 0, 0); } break; case IDMF_INDEX: MessageBox(hWnd, "open help file not finish yet ... ", szAppName, MB_OK); break; case IDMF_ABOUT: MessageBox(hWnd, "COSCO SHIPYARD TCSH 型材套料程序 /n Idea : Chenyong /n Code : liuxing /n Version : 1.0v", szAppName, MB_OK|MB_ICONINFORMATION); break; } } // HandleMenu /* */ void OpenCSVFile(HWND hWnd, CList& NesteList) { OPENFILENAME ofn; // common dialog box structure char szFile[60]; // buffer for file name // Initialize OPENFILENAME ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '/0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "CSV(逗号分隔符)(*.csv)/0 *.csv/0All/0 *.*/0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = "Open"; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn) ) { ReadCSVFile(hWnd, ofn.lpstrFile, NesteList); } else { //MessageBox(hWnd, "open file cancel or failed... ", szAppName, MB_OK); } } // OpenCSVFile /* */ void SaveCSVFile(HWND hWnd, CList& NesteList) { OPENFILENAME ofn; // common dialog box structure char szFile[60]; // buffer for file name // Initialize OPENFILENAME ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hWnd; ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '/0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "CSV(逗号分隔符)(*.csv)/0 *.csv/0All/0 *.*/0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = "Open"; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetSaveFileName(&ofn) ) { //--------------------------------------------------------------------- // Write to a csv file for testing... strcpy(szBuffer, ofn.lpstrFile); strcat(szBuffer, ".csv"); WriteFile(hWnd, szBuffer, NesteList); } else { } } // SaveCSVFile /* Parameter : HWND Return : void Description : Read csv file. */ bool ReadCSVFile(HWND hWnd, char *szFile, CList& NesteList) { string buffer; ElemType data; ifstream iFile(szFile); if (!iFile.is_open()) { sprintf(szBuffer, " open file %s failed... ", szFile); MessageBox(hWnd, szBuffer, szAppName, MB_OK|MB_ICONWARNING); return false; } getline(iFile, buffer, '/n'); // ignore the first line getline(iFile, buffer, '/n'); // ignore the second line while (getline(iFile, buffer, '/n') ) { //MessageBox(hWnd, buffer.c_str(), szAppName, MB_OK); int iFirst; int iLast; //-------------------------------------------------- // Get PartName iFirst = buffer.find(","); iLast = buffer.find_last_not_of(","); data.PartName = buffer.substr(0, iFirst); //-------------------------------------------------- // Get weight buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Weight = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "weight is : %.2f ", data.Weight); // for test //MessageBox(hWnd, szBuffer, szAppName, MB_OK); // for test //-------------------------------------------------- // Get xPos buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.xPos = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "xPos is : %.2f ", data.xPos); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //-------------------------------------------------- // Get yPos buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.yPos = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "yPos is : %.2f ", data.yPos); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //--------------------------------------------------- // Get zPos buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.zPos = atof(buffer.substr(0,iFirst).c_str()); //sprintf(szBuffer, "zPos is : %.2f ", data.zPos); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //---------------------------------------------------- // Get Panel buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Panel = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Panel.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get block buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Block = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Block.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get part buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Part = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Part.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get Type buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Type = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Type.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get Side buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Side = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Side.c_str(), szAppName, MB_OK); //--------------------------------------------------- // Get Stock Number buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.StockNumber = atoi(buffer.substr(0,iFirst).c_str()); //sprintf(szBuffer, "stock number is : %d ", data.StockNumber); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //---------------------------------------------------- // Get Quality buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Quality = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Quality.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get GPS1 buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.GPS1 = buffer.substr(0,iFirst); //MessageBox(hWnd, data.GPS1.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get GPS2 buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.GPS2 = buffer.substr(0,iFirst); //MessageBox(hWnd, data.GPS2.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get GPS3 buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.GPS3 = buffer.substr(0,iFirst); //MessageBox(hWnd, data.GPS3.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get GPS4 buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.GPS4 = buffer.substr(0,iFirst); //MessageBox(hWnd, data.GPS4.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get Ship buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Ship = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Ship.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get Ident buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Ident = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Ident.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get NestedOn buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.NestedOn = buffer.substr(0,iFirst); //MessageBox(hWnd, data.NestedOn.c_str(), szAppName, MB_OK); //-------------------------------------------------- // Get Area buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Area = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Area is : %.5f ", data.Area); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //-------------------------------------------------- // Get Circ. Length buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.CircLength = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Circ. Length is : %.2f ", data.CircLength); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //-------------------------------------------------- // Get Circ. Width buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.CircWidth = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Circ. Width is : %.2f ", data.CircWidth); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //-------------------------------------------------- // Get Thickness buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Thickness = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Thickness is : %.2f ", data.Thickness); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //---------------------------------------------------- // Get Shape buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Shape = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Shape.c_str(), szAppName, MB_OK); //---------------------------------------------------- // Get Dimension buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.Dimension = buffer.substr(0,iFirst); //MessageBox(hWnd, data.Dimension.c_str(), szAppName, MB_OK); //-------------------------------------------------- // Get Total Length buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.TotalLength = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Total Length is : %.2f ", data.TotalLength); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //-------------------------------------------------- // Get Moulded Length buffer = buffer.substr(iFirst+1, iLast); iFirst = buffer.find(","); data.MouldedLength = atof(buffer.substr(0, iFirst).c_str()); //sprintf(szBuffer, "Moulded Length is : %.2f ", data.MouldedLength); //MessageBox(hWnd, szBuffer, szAppName, MB_OK); //----------------------------------------------------------- // Now insert the right data to the list, i.e Shape equal HP if (data.Shape == "HP ") { NesteList.Insert(1, data); } } iFile.close(); sprintf(szBuffer, " Read file successed! /n Totally insert %d records! ", NesteList.GetLength()); MessageBox(hWnd, szBuffer, szAppName, MB_OK|MB_ICONINFORMATION); return true; } // ReadCSVFile /* Parameter : CList& Return : true or false Description : */ bool WriteFile(HWND hWnd, char *szFile, CList &NesteList) { ElemType TempData; CList TempList; if (!NesteList.isEmpty() ) { ofstream oFile(szFile); if (!oFile.is_open() ) { sprintf(szBuffer, "create file %s failed ... ", szFile); MessageBox(NULL, szBuffer, szAppName, MB_OK|MB_ICONWARNING); return false; } oFile<<"套料号"<<","<<"材质"<<","<<"零件名"<<","<<"流向"<<","<<"长度"<<endl; for (int i = 1; i<= NesteList.GetLength(); ++i) { NesteList.GetElem(i, TempData); oFile<<TempData.Shape<<TempData.Dimension<<","<<TempData.Quality<<","<<TempData.PartName<<","<<TempData.GPS4<<","<<TempData.TotalLength<<endl; } oFile.close(); } else { MessageBox(NULL, "There is no record in the list... ", szAppName, MB_OK|MB_ICONWARNING); } return true; } // WriteFile /* Parameter : HWND Return : HWND Description : */ HWND CreateListView(HWND hWndParent, int iColumn) { char* szHeading[6] = {"No.", "规格", "材质", "零件名", "流向", "长度"}; HWND hWndListView; RECT rect; LVCOLUMN lvc; INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&icex); GetClientRect(hWndParent, &rect); hWndListView = CreateWindow(WC_LISTVIEW, "", WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT, rect.left, rect.top, rect.right, rect.bottom, hWndParent, NULL, (HINSTANCE)GetWindowLong(hWndParent,GWL_HINSTANCE), NULL); ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); lvc.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; for (int ic = 0; ic<iColumn; ++ic) { lvc.iSubItem = ic; lvc.pszText = szHeading[ic]; lvc.cx = 100; ListView_InsertColumn(hWndListView, ic, &lvc); } return hWndListView; } // CreateListView /* */ void InsertItem(HWND hWnd, CList& NesteList) { LVITEM lvi; ElemType data; lvi.mask = LVIF_TEXT|LVIF_PARAM; for (int i=1; i<=NesteList.GetLength(); ++i) { NesteList.GetElem(i, data); sprintf(szBuffer, "%s", data.Dimension.c_str()); lvi.iItem = i-1; lvi.iSubItem = 0; lvi.pszText = szBuffer; ListView_InsertItem(hWnd, &lvi); } } // InsertItem 此程序为Win32 API程序。