311 lines
9.2 KiB
C++
311 lines
9.2 KiB
C++
#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;
|
|
}
|