|
|
#include "stdafx.h"
#include "resource.h"
#include "MainWnd.h"
#include "TreeViewWnd.h"
#include "ListViewWnd.h"
//
// global WndProcs, for handling subclassed windows
//
WNDPROC gTreeViewWndSysWndProc = NULL; WNDPROC gListViewWndSysWndProc = NULL;
#define _ADDDUMMYITEMS // add dummy items for debugging TreeViewWnd
#define _ADDDUMMYPROPERTIES // add dummy properties for debugging ListViewWnd
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrls.dwICC = ICC_TREEVIEW_CLASSES|ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&InitCtrls);
TCHAR szWndName[255]; TCHAR szWndClassName[255]; LoadString(hInstance,IDS_APPNAME,szWndName,sizeof(szWndName)); LoadString(hInstance,IDC_APPWNDCLASS,szWndClassName,sizeof(szWndClassName));
CMainWnd MainWnd(NULL); HWND hWnd = MainWnd.Create(szWndName, szWndClassName, WS_OVERLAPPEDWINDOW, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, LoadMenu( hInstance, MAKEINTRESOURCE(IDC_PROPVIEW_MENU)), hInstance ); if (!hWnd) { Trace(TEXT("\nUnable to create main appication window\n")); return FALSE; }
ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd);
//
// create TREEVIEW child window
//
LoadString(hInstance,IDS_TREEVIEWNAME,szWndName,sizeof(szWndName)); LoadString(hInstance,IDC_TREEVIEWWNDCLASS,szWndClassName,sizeof(szWndClassName));
//
// calculate the child window's height and width using the parents dimisions.
// note: Child's starting width is 1/3 the parents width.
//
RECT MainWndClientRect; GetClientRect(hWnd,&MainWndClientRect); INT iWindowWidth = (MainWndClientRect.right - MainWndClientRect.left)/3; INT iWindowHeight = (MainWndClientRect.bottom - MainWndClientRect.top);
CTreeViewWnd TreeViewWnd(NULL); HWND hTreeViewWnd = TreeViewWnd.Create(szWndName, szWndClassName, WS_CHILD|WS_VISIBLE|WS_SIZEBOX|WS_TABSTOP| TVS_HASBUTTONS|TVS_HASLINES |TVS_LINESATROOT| TVS_EDITLABELS | TVS_SHOWSELALWAYS, WS_EX_CLIENTEDGE/*|WS_EX_NOPARENTNOTIFY*/, 0, 0, iWindowWidth, iWindowHeight, hWnd, NULL, hInstance);
if (!hTreeViewWnd) { Trace(TEXT("\nUnable to create tree view window\n")); return FALSE; }
TreeViewWnd.SetWindowHandle(hTreeViewWnd);
#ifdef _ADDDUMMYITEMS
//
// TODO: Remove this code.
// (inserting items to see if we are working properly)
//
INT ICON_ROOTITEM = -1; INT ICON_FOLDER = -1; INT ICON_ITEM = -1;
TV_INSERTSTRUCT tv;
tv.hParent = TVI_ROOT; tv.hInsertAfter = TVI_LAST; tv.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_PARAM; tv.item.hItem = NULL; tv.item.state = TVIS_EXPANDED; tv.item.stateMask = TVIS_STATEIMAGEMASK; tv.item.cchTextMax = 6; tv.item.cChildren = 0; tv.item.lParam = 0; tv.item.pszText = TEXT("Root Item");
//
// Create image list
//
HIMAGELIST hImageList = NULL;
hImageList = CreateImageList(16,16,0,3); if(hImageList != NULL) {
//
// assign indexes to loaded icons
//
AddIconToImageList(hInstance,IDI_ROOTICON,hImageList,&ICON_ROOTITEM); AddIconToImageList(hInstance,IDI_FOLDERICON,hImageList,&ICON_FOLDER); AddIconToImageList(hInstance,IDI_ITEM,hImageList,&ICON_ITEM);
//
// set image list
//
TreeViewWnd.SetImageList(hImageList,TVSIL_NORMAL); } else { Trace(TEXT("Image list failed to be created")); }
//
// Add the Root Item
//
tv.item.iImage = ICON_ROOTITEM; tv.item.iSelectedImage = ICON_ROOTITEM;
HTREEITEM hTreeItem = NULL; hTreeItem = TreeViewWnd.InsertItem(&tv);
//
// Add child items
//
tv.item.iImage = ICON_ITEM; tv.item.iSelectedImage = ICON_ITEM;
tv.hParent = hTreeItem; tv.item.pszText = TEXT("Child Item 1"); hTreeItem = TreeViewWnd.InsertItem(&tv);
tv.item.pszText = TEXT("Child Item 2"); hTreeItem = TreeViewWnd.InsertItem(&tv);
//
// Add a Folder
//
tv.item.iImage = ICON_FOLDER; tv.item.iSelectedImage = ICON_FOLDER;
tv.item.pszText = TEXT("Folder Item"); hTreeItem = TreeViewWnd.InsertItem(&tv);
//
// Add child item
//
tv.item.iImage = ICON_ITEM; tv.item.iSelectedImage = ICON_ITEM;
tv.hParent = hTreeItem; tv.item.pszText = TEXT("Folder Child Item 1"); hTreeItem = TreeViewWnd.InsertItem(&tv);
#endif
ShowWindow(hTreeViewWnd, SW_SHOW); UpdateWindow(hTreeViewWnd);
//
// create LISTVIEW child window
//
LoadString(hInstance,IDS_LISTVIEWNAME,szWndName,sizeof(szWndName)); LoadString(hInstance,IDC_LISTVIEWWNDCLASS,szWndClassName,sizeof(szWndClassName));
//
// calculate the child window's width using the ListView's width and Parent's width dimisions.
// note: ListView will be offset to the right in relation to the TreeView window (sibling)
//
INT iTreeViewWidth = iWindowWidth; INT iXOffset = iTreeViewWidth; iWindowWidth = (MainWndClientRect.right - MainWndClientRect.left) - iTreeViewWidth;
CListViewWnd ListViewWnd(NULL); HWND hListViewWnd = ListViewWnd.Create(szWndName, szWndClassName, WS_CHILD|WS_VISIBLE|WS_SIZEBOX|WS_TABSTOP| LVS_REPORT|LVS_EDITLABELS|LVS_SINGLESEL, WS_EX_CLIENTEDGE|WS_EX_NOPARENTNOTIFY, iXOffset,0, iWindowWidth, iWindowHeight, hWnd, NULL, hInstance );
if (!hListViewWnd) { Trace(TEXT("\nUnable to create list view window\n")); return FALSE; }
ListViewWnd.SetWindowHandle(hListViewWnd);
#ifdef _ADDDUMMYPROPERTIES
LVCOLUMN lv; LV_ITEM lvitem;
INT nNewColumnIndex = 0; INT PropID = 0;
TCHAR szString[255];
//
// add column headers, from resource
//
LoadString(hInstance,IDS_PROPERTYNAME,szString,sizeof(szString));
lv.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lv.fmt = LVCFMT_LEFT ; lv.cx = 100; lv.pszText = szString; lv.cchTextMax = 0; lv.iOrder = nNewColumnIndex; lv.iSubItem = nNewColumnIndex; nNewColumnIndex = ListViewWnd.InsertColumn(0,&lv); nNewColumnIndex++;
LoadString(hInstance,IDS_PROPERTYVALUE,szString,sizeof(szString)); nNewColumnIndex = ListViewWnd.InsertColumn(1,&lv); nNewColumnIndex++;
LoadString(hInstance,IDS_PROPERTYTYPE,szString,sizeof(szString)); nNewColumnIndex = ListViewWnd.InsertColumn(2,&lv); nNewColumnIndex++;
LoadString(hInstance,IDS_PROPERTYACCESS,szString,sizeof(szString)); nNewColumnIndex = ListViewWnd.InsertColumn(3,&lv);
//
// add properties
//
lvitem.mask = LVIF_TEXT | LVIF_PARAM; // set PARAM mask, if setting lParam value
lvitem.pszText = szString; lvitem.iImage = NULL; lvitem.lParam = PropID;
for(INT nItem = 0; nItem < 100;nItem++) { lvitem.mask = LVIF_TEXT; // set TEXT mask
lvitem.iItem = nItem; lvitem.iSubItem = 0; //first column
sprintf(szString,"Property %d",nItem); ListViewWnd.InsertItem(&lvitem);
lvitem.iSubItem = 1; //second column
sprintf(szString,"%d",nItem+100); ListViewWnd.SetItem(&lvitem);
lvitem.iSubItem = 2; //third column
lstrcpy(szString,TEXT("VT_I4")); ListViewWnd.SetItem(&lvitem);
lvitem.iSubItem = 3; //fourth column
lstrcpy(szString,TEXT("READONLY")); ListViewWnd.SetItem(&lvitem); }
#endif
ShowWindow(hListViewWnd, SW_SHOW); UpdateWindow(hListViewWnd);
//
// Load the Accelerator keys
//
HACCEL hAccel = LoadAccelerators( hInstance, (LPCTSTR)IDC_PROPVIEW );
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator( hWnd, hAccel, &msg )) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; }
|