long APIENTRY WindowShowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { LV_ITEM item; switch (message) { case WM_INITDIALOG: ApplyDialogFont((HWND)GetDlgItem(hwnd, IDC_FILELIST)); if (!CreateWindowData(hwnd, TRUE)) EndDialog(hwnd, 1); else CenterWindow(hwnd); return 0; case WM_NOTIFY: if (wParam == IDC_FILELIST) { if (((LPNMHDR)lParam)->code == NM_DBLCLK) { LPNMITEMACTIVATE plvdi = (LPNMITEMACTIVATE)lParam; item.iItem = plvdi->iItem; item.iSubItem = 0; item.mask = LVIF_PARAM; ListView_GetItem(GetDlgItem(hwnd, IDC_FILELIST), &item); SendMessage(hwndClient, WM_MDIACTIVATE, (WPARAM)item.lParam, 0); EndDialog(hwnd, IDOK); } } return 0; case WM_COMMAND: switch (wParam &0xffff) { case IDCANCEL: EndDialog(hwnd, IDCANCEL); break; } break; case WM_CLOSE: PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0); break; } return 0; }
LRESULT CALLBACK ThreadProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { LV_ITEM item; LV_COLUMN lvC; RECT r; int i; char module[256]; THREAD *sl; LPNMHDR nmh; switch (iMessage) { case WM_CTLCOLORSTATIC: { return (LRESULT)(HBRUSH)(COLOR_WINDOW + 1); } case WM_TIMER: KillTimer(hwnd, 100); ListView_SetItemState(hwndLV, curSel, 0, LVIS_SELECTED); break; case WM_NOTIFY: nmh = (LPNMHDR)lParam; if (nmh->code == NM_SETFOCUS) { PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0); SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); } else if (nmh->code == LVN_GETDISPINFO) { LV_DISPINFO *p = (LV_DISPINFO *)lParam; THREAD *x = (THREAD *)p->item.lParam; char name[256], name1[256]; if (p->item.iSubItem == 2) { int eip = x->regs.Eip; int n; n = FindFunctionName(name1, eip, NULL, NULL); if (!n) name1[0] = 0; sprintf(name, "%s + 0x%x", name1, eip - n); } else { sprintf(name, "%d", x->idThread); } p->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; p->item.mask &= ~LVIF_STATE; p->item.pszText = name; } else if (nmh->code == LVN_ITEMCHANGED) { LPNMLISTVIEW p = (LPNMLISTVIEW)lParam; if (p->uChanged & LVIF_STATE) { if (p->uNewState & LVIS_SELECTED) { i = 0; PostMessage(hwnd, WM_USER, p->iItem, 0); SetTimer(hwnd, 100, 400, 0); } } } else if (nmh->code == LVN_KEYDOWN) { switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'C': if (GetKeyState(VK_CONTROL) &0x80000000) { CopyText(hwnd); } break; case VK_UP: if (curSel > 0) SendMessage(hwnd, WM_USER, curSel-1, 0); break; case VK_DOWN: if (curSel < ListView_GetItemCount(hwndLV) - 1) SendMessage(hwnd, WM_USER, curSel + 1, 0); break; } } break; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_TBTHREADS: if (HIWORD(wParam) == CBN_SELENDOK) { int i = SendMessage(hwndTbThreads, CB_GETCURSEL, 0, 0); if (i != CB_ERR) { SendMessage(hwnd, WM_USER, i, 0); curSel = i; } } break; } break; case WM_USER: { memset(&item, 0, sizeof(item)); item.iItem = curSel; item.iSubItem = 0; item.mask = LVIF_IMAGE; item.iImage = 8; ListView_SetItem(hwndLV, &item); curSel = wParam; sl = activeProcess->threads; while (sl && wParam--) sl = sl->next; activeThread = sl; item.iItem = curSel; item.mask = LVIF_IMAGE; item.iImage = 4; ListView_SetItem(hwndLV, &item); PostDIDMessage(DID_REGWND, WM_COMMAND, ID_SETADDRESS, (LPARAM) activeThread->hThread); PostDIDMessage(DID_WATCHWND, WM_COMMAND, ID_SETADDRESS, 0); PostDIDMessage(DID_WATCHWND+1, WM_COMMAND, ID_SETADDRESS, 0); PostDIDMessage(DID_WATCHWND+2, WM_COMMAND, ID_SETADDRESS, 0); PostDIDMessage(DID_WATCHWND+3, WM_COMMAND, ID_SETADDRESS, 0); PostDIDMessage(DID_LOCALSWND, WM_COMMAND, ID_SETADDRESS, 0); PostDIDMessage(DID_STACKWND, WM_RESTACK, (WPARAM)1, 0); PostDIDMessage(DID_MEMWND, WM_RESTACK, 0, 0); PostDIDMessage(DID_MEMWND+1, WM_RESTACK, 0, 0); PostDIDMessage(DID_MEMWND+2, WM_RESTACK, 0, 0); PostDIDMessage(DID_MEMWND+3, WM_RESTACK, 0, 0); SendMessage(hwndASM, WM_COMMAND, ID_SETADDRESS, (LPARAM) activeThread->regs.Eip); SendMessage(hwndTbThreads, CB_SETCURSEL, curSel, 0); } break; case WM_CREATE: hwndThread = hwnd; GetClientRect(hwnd, &r); hwndLV = CreateWindowEx(0, WC_LISTVIEW, "", LVS_REPORT | LVS_SINGLESEL | WS_CHILD | WS_VISIBLE | WS_BORDER, 0,0,r.right-r.left, r.bottom - r.top, hwnd, 0, hInstance, 0); ListView_SetExtendedListViewStyle(hwndLV, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER); ApplyDialogFont(hwndLV); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM ; lvC.cx = 20; lvC.iSubItem = 0; ListView_InsertColumn(hwndLV, 0, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 60; lvC.iSubItem = 1; lvC.pszText = "Id"; ListView_InsertColumn(hwndLV, 1, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 120; lvC.iSubItem = 2; lvC.pszText = "Location"; ListView_InsertColumn(hwndLV, 2, &lvC); ListView_SetImageList(hwndLV, tagImageList, LVSIL_SMALL); break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndLV, r.left, r.top, r.right - r.left, r.bottom - r.top, 1); break; case WM_DESTROY: hwndThread = 0; break; case WM_RESTACK: EnableWindow(hwndLV, uState != notDebugging && wParam); EnableWindow(hwndTbThreads, uState != notDebugging && wParam); if (uState != notDebugging && wParam) { int i = 0; THREAD *list = activeProcess->threads; ListView_DeleteAllItems(hwndLV); memset(&item, 0, sizeof(item)); SendMessage(hwndTbThreads, CB_RESETCONTENT, 0, 0); while (list) { char buf[260]; item.iItem = i; item.iSubItem = 0; item.mask = LVIF_IMAGE | LVIF_PARAM; if (list->idThread == activeThread->idThread) { item.iImage = 4; curSel = i; } else { item.iImage = 8; } item.lParam = (LPARAM)list; ListView_InsertItem(hwndLV, &item); item.iSubItem = 1; item.mask = LVIF_PARAM | LVIF_TEXT; item.lParam = (LPARAM)list; item.pszText = ""; ListView_InsertItem(hwndLV, &item); item.iSubItem = 2; item.mask = LVIF_PARAM | LVIF_TEXT; item.lParam = (LPARAM)list; item.pszText = ""; ListView_InsertItem(hwndLV, &item); sprintf(buf, "%d %s", list->idThread, list->name); SendMessage(hwndTbThreads, CB_ADDSTRING, 0, (LPARAM)buf); i++, list = list->next; } SendMessage(hwndTbThreads, CB_SETCURSEL, curSel, 0); } break; case WM_SETFOCUS: break; case WM_KILLFOCUS: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK RegisterProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static int charwidth; HDC dc; TEXTMETRIC metric; DEBUG_EVENT *xc; LOGBRUSH brushstr; RECT r; int i; NM_TREEVIEW *nmt; switch (iMessage) { case WM_NOTIFY: nmt = (NM_TREEVIEW*)lParam; switch (nmt->hdr.code) { case TCN_EDITQUERY: if (uState != atBreakpoint) return 0; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].hTreeItem == nmt->itemNew.hItem) if (regs[i].flags &editable) return (LRESULT)regs[i].ptrs.col2Text; return 0; case TCN_EDITDONE: for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].hTreeItem == nmt->itemNew.hItem) { char *buf = (char*)nmt->itemNew.pszText; if (regs[i].flags &floating) { float val; BYTE *pos = regs[i].currentdataptr; sscanf(buf, "%f", &val); *(long double*)pos = val; sprintf(regs[i].ptrs.col2Text, "%f", (double)val); } else { if (buf[0] == '0' && buf[1] == 'x') sscanf(buf + 2, "%x", (int *)regs[i].currentdataptr); else if ((buf[strlen(buf) - 1] &0xDF) == 'H') sscanf(buf, "%x", (int *)regs[i].currentdataptr); else sscanf(buf, "%d", (int *)regs[i].currentdataptr); sprintf(regs[i].ptrs.col2Text, "0x%08x", *(int *)regs[i].currentdataptr); } regs[i].ptrs.col2Color = 0xff; } return 0; } break; case WM_SYSCOMMAND: if (wParam == SC_CLOSE) SendMessage(hwnd, WM_CLOSE, 0, 0); break; case WM_LBUTTONDOWN: break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_SETCONTEXT: SaveRegisterContext(); break; case ID_SETADDRESS: regContext = activeThread->regs; registerHandle = (HANDLE)lParam; if (lParam) { int i; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) if (regs[i].currentdataptr) { if (regs[i].flags &floating) { double val; BYTE *pos = regs[i].currentdataptr; val = *(long double*)pos; sprintf(regs[i].ptrs.col2Text, "%f", val); if (!memcmp(regs[i].currentdataptr, regs[i].olddataptr, sizeof(long double))) regs[i].ptrs.col2Color = 0; else regs[i].ptrs.col2Color = 0xff; } else { sprintf(regs[i].ptrs.col2Text, "0x%08x", *(int *)regs[i].currentdataptr); if (*(int *)regs[i].currentdataptr == *(int *)regs[i].olddataptr) regs[i].ptrs.col2Color = 0; else regs[i].ptrs.col2Color = 0xff; } } if (!drawn) { HTREEITEM after1 = 0, after2 = 0; for (i = 0; i < sizeof(regs) / sizeof(REGDATA); i++) { TV_INSERTSTRUCT t; memset(&t, 0, sizeof(t)); t.hParent = regs[i].currentdataptr ? after1 : 0; t.hInsertAfter = regs[i].currentdataptr ? after2 : after1; t.UNNAMED_UNION item.mask = 0; t.UNNAMED_UNION item.hItem = 0; t.UNNAMED_UNION item.lParam = (int) ®s[i].ptrs; regs[i].hTreeItem = TreeView_InsertItem(hwndTree, &t); if (!regs[i].currentdataptr) { TreeView_Expand(hwndTree, after1, TVE_EXPAND); after1 = regs[i].hTreeItem; after2 = 0; } else after2 = regs[i].hTreeItem; } TreeView_Expand(hwndTree, after1, TVE_EXPAND); drawn = TRUE; } } else if (!lParam && drawn) { TreeView_DeleteAllItems(hwndTree); drawn = FALSE; } InvalidateRect(hwndTree, 0, 0); break; default: break; } break; case WM_ACTIVATEME: SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); break; case WM_KILLFOCUS: break; case WM_CREATE: GetClientRect(hwnd, &r); // valueBitmap = LoadBitmap(hInstance, "ID_VALUEBMP") ; // itemBitmap = LoadBitmap(hInstance, "ID_ITEMBMP") ; tch.colBmp1 = itemBitmap; tch.colBmp2 = valueBitmap; hwndTree = CreateextTreeWindow(hwnd, TCS_LINE | WS_VISIBLE, &r, &tch); ApplyDialogFont(hwndTree); break; case WM_CLOSE: break; case WM_DESTROY: DestroyWindow(hwndTree); // DeleteObject(itemBitmap) ; // DeleteObject(valueBitmap) ; hwndRegister = 0; registerHandle = 0; break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndTree, r.left, r.top, r.right - r.left, r.bottom - r.top, 0); break; case WM_INITMENUPOPUP: break; default: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK BrowseProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static HFONT font; LV_ITEM item; POINT pt; LV_COLUMN lvC; RECT r; int i; LPNMHDR nmh; static LVITEM pressed; switch (iMessage) { case WM_USER+1: { DWINFO info; char *q; memset(&info,0, sizeof(info)); strcpy(info.dwName, browselist[pressed.lParam]->file); q = strrchr(info.dwName, '\\'); if (q) strcpy(info.dwTitle, q + 1); else strcpy(info.dwTitle, info.dwName); info.dwLineNo = TagNewLine(browselist[pressed.lParam]->file, browselist[pressed.lParam]->line); info.logMRU = FALSE; info.newFile = FALSE; CreateDrawWindow(&info, TRUE); break; } case WM_CTLCOLORSTATIC: { return (LRESULT)(HBRUSH)(COLOR_INACTIVECAPTION + 1); } case WM_CTLCOLORBTN: { return (LRESULT)GetStockObject(NULL_BRUSH); } case WM_NOTIFY: nmh = (LPNMHDR)lParam; if (nmh->code == NM_SETFOCUS) { PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0); SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); } else if (nmh->code == LVN_GETDISPINFO) { LV_DISPINFO *p = (LV_DISPINFO *)lParam; char name[512] = "", *q; switch (p->item.iSubItem) { case 1: /* id*/ sprintf(name,"%d", p->item.lParam +1); break; case 2: /*name*/ strcpy(name, browselist[p->item.lParam]->name); break; case 3: /* browse */ sprintf(name, "%d", browselist[p->item.lParam]->line); break; case 4: /*file*/ q = strrchr(browselist[p->item.lParam]->file, '\\'); if (!q) q = browselist[p->item.lParam]->file; else q++; strcpy(name, q); break; } if (name[0]) { p->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; p->item.mask &= ~LVIF_STATE; p->item.pszText = name; } } else if (((LPNMHDR)lParam)->code == NM_DBLCLK) { LVHITTESTINFO hittest; GetCursorPos(&hittest.pt); ScreenToClient(hwndLV, &hittest.pt); if (ListView_SubItemHitTest(hwndLV, &hittest) >= 0) { LVITEM lvitem; lvitem.iItem = hittest.iItem; lvitem.iSubItem = 0; lvitem.mask = LVIF_PARAM; ListView_GetItem(hwndLV, &lvitem); memcpy(&pressed, &lvitem, sizeof(pressed)); SendMessage(hwnd, WM_USER + 1, 0, 0); } } else if (nmh->code == LVN_KEYDOWN) { switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'C': if (GetKeyState(VK_CONTROL) &0x80000000) { CopyText(hwnd); } break; case VK_UP: if (curSel > 0) SendMessage(hwnd, WM_USER, curSel-1, 0); break; case VK_DOWN: if (curSel < ListView_GetItemCount(hwndLV) - 1) SendMessage(hwnd, WM_USER, curSel + 1, 0); break; } } break; case WM_COMMAND: switch(wParam) { case IDC_RETURN: GetWindowText(hwndEdit, brsName, sizeof(brsName)); SendMessage(hwndCombo, WM_SAVEHISTORY, 0, 0); CreateUsageList(); return 0; case IDC_ESCAPE: SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)brsName); return 0; default: if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 300) { displayFull = !displayFull; PostMessage(hwnd, WM_USER, 0, 0); } if (HIWORD(wParam) == CBN_SELENDOK && LOWORD(wParam) == 500) { PostMessage(hwnd, WM_COMMAND, IDC_RETURN, 0); } break; } break; case WM_USER: { int k = 0; char buf[40]; sprintf(buf, "%d Usages", browsecount); SetWindowText(hwndButton, buf); ListView_DeleteAllItems(hwndLV); memset(&item, 0, sizeof(item)); for (i=0; i < browsecount; i++) { if (displayFull || browselist[i]->definition || browselist[i]->declaration) { item.iItem = k++; item.iSubItem = 0; item.mask = LVIF_IMAGE | LVIF_PARAM; item.lParam = i; item.iImage = browselist[i]->definition ? 0 : browselist[i]->declaration ? 1 : 2; ListView_InsertItem(hwndLV, &item); } } } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT pDis = (LPDRAWITEMSTRUCT)lParam; HDC memdc; char staticText[256]; BOOL state = !! displayFull; int len = SendMessage(pDis->hwndItem, WM_GETTEXT, sizeof(staticText), (LPARAM)staticText); SIZE sz; RECT r; POINT textpos, iconpos; GetClientRect(pDis->hwndItem, &r); GetTextExtentPoint32(pDis->hDC, staticText, len, &sz); SetBkMode(pDis->hDC, TRANSPARENT); iconpos.x = 4; iconpos.y = (r.bottom - r.top - 16)/2; textpos.x = r.right - 4 - sz.cx; textpos.y = (r.bottom - r.top - sz.cy)/2; DrawFrameControl(pDis->hDC, &pDis->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH | (state ? DFCS_PUSHED : 0)); TextOut(pDis->hDC, pDis->rcItem.left+ textpos.x, pDis->rcItem.top+textpos.y, staticText, len); memdc = CreateCompatibleDC(pDis->hDC); SelectObject(memdc, buttonbmp); TransparentBlt(pDis->hDC, pDis->rcItem.left+ iconpos.x, pDis->rcItem.top+iconpos.y, 16, 16, memdc, 0, 0, 16, 16, 0xc0c0c0); DeleteDC(memdc); } return 0; case WM_CREATE: hwndBrowse = hwnd; GetClientRect(hwnd, &r); hwndBackground = CreateWindow("static", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0,0, r.right - r.bottom, BUTTONHEIGHT + 4, hwnd, 0, hInstance, 0); hwndButton = CreateWindow("button", "0 Usages", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 2,2,BUTTONWIDTH,BUTTONHEIGHT, hwnd, (HMENU)300, hInstance, 0); ApplyDialogFont(hwndButton); hwndCombo = CreateWindow("COMBOBOX", "", WS_CHILD + WS_CLIPSIBLINGS + WS_BORDER + WS_VISIBLE + CBS_DROPDOWN + CBS_AUTOHSCROLL, BUTTONWIDTH + 10, 4, 200, 100, hwnd, (HMENU)500, hInstance, 0); ApplyDialogFont(hwndCombo); SubClassHistoryCombo(hwndCombo); SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); pt.x = pt.y = 5; hwndEdit = ChildWindowFromPoint(hwndCombo, pt); oldproc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (int)EditHook); BringWindowToTop(hwndButton); BringWindowToTop(hwndCombo); font = CreateFontIndirect(&systemDialogFont); SendMessage(hwndErrButton, WM_SETFONT, (WPARAM)font, 0); SendMessage(hwndWarnButton, WM_SETFONT, (WPARAM)font, 0); hwndLV = CreateWindowEx(0, WC_LISTVIEW, "", LVS_REPORT | LVS_SINGLESEL | WS_CHILD | WS_VISIBLE | WS_BORDER, 0,BUTTONHEIGHT + 4,r.right-r.left, r.bottom - r.top-BUTTONHEIGHT-4, hwnd, 0, hInstance, 0); ListView_SetExtendedListViewStyle(hwndLV, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER); ApplyDialogFont(hwndLV); GetWindowRect(hwndLV, &r); lvC.mask = LVCF_WIDTH; lvC.cx = 50; lvC.iSubItem = 0; ListView_InsertColumn(hwndLV, 0, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 1; lvC.pszText = "Id"; ListView_InsertColumn(hwndLV, 1, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 250; lvC.iSubItem = 2; lvC.pszText = "Name"; ListView_InsertColumn(hwndLV, 2, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 3; lvC.pszText = "Line"; ListView_InsertColumn(hwndLV, 3, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = r.right - r.left - 375; lvC.iSubItem = 4; lvC.pszText = "File"; ListView_InsertColumn(hwndLV, 4, &lvC); ListView_SetImageList(hwndLV, tagImageList, LVSIL_SMALL); break; case WM_RESETHISTORY: SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndLV, r.left, r.top+BUTTONHEIGHT + 4, r.right - r.left, r.bottom - r.top-BUTTONHEIGHT - 4, 1); MoveWindow(hwndBackground, r.left, r.top, r.right - r.left, BUTTONHEIGHT + 4, 1); lvC.mask = LVCF_WIDTH; lvC.cx = r.right - r.left - 375; ListView_SetColumn(hwndLV, 4, &lvC); break; case WM_DESTROY: hwndBrowse = 0; break; case WM_SETFOCUS: break; case WM_KILLFOCUS: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT CALLBACK PropsTabWndWndProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static int selected, sizingbottom; static HIMAGELIST tabIml; static int ilProps, ilToolbox; RECT r; TC_ITEM tie; NMHDR *h; DRAWITEMSTRUCT *dr; HFONT font; HBITMAP hbmp; HDC hMemDC; PAINTSTRUCT paint; HDC dc; switch (iMessage) { case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; case WM_NOTIFY: h = (NMHDR*)lParam; switch (h->code) { case TCN_SELCHANGE: switch (selected = TabCtrl_GetCurSel(hwndPropsTabCtrl)) { case 0: ShowWindow(hwndToolbox, SW_HIDE) ; ShowWindow(hwndProps, SW_SHOW) ; break; case 1: ShowWindow(hwndProps, SW_HIDE) ; ShowWindow(hwndToolbox, SW_SHOW) ; break; } } break; case WM_SETTEXT: return SendMessage(hwndPropsTabCtrl, iMessage, wParam, lParam); case WM_DRAWITEM: dr = (DRAWITEMSTRUCT*)lParam; hMemDC = CreateCompatibleDC(dr->hDC); hbmp = SelectObject(hMemDC, *bitmaps[dr->itemID]); BitBlt(dr->hDC, dr->rcItem.left + 2, dr->rcItem.bottom - 18, 16, 16, hMemDC, 0, 0, SRCCOPY); font = SelectObject(dr->hDC, font); TextOut(dr->hDC, dr->rcItem.left + 18, dr->rcItem.bottom - 16, nameTags[dr->itemID], strlen(nameTags[dr->itemID])); font = SelectObject(dr->hDC, font); SelectObject(dr->hDC, hbmp); DeleteDC(hMemDC); break; case WM_CREATE: hwndPropsTab = hwnd; GetClientRect(hwnd, &r); hwndPropsTabCtrl = CreateWindow(WC_TABCONTROL, 0, WS_CHILD + WS_CLIPSIBLINGS + WS_VISIBLE + TCS_FLATBUTTONS /*+ TCS_OWNERDRAWFIXED */ + TCS_FOCUSNEVER /*+ TCS_FIXEDWIDTH*/ + TCS_BOTTOM, r.left, r.top, r.right - r.left, r.bottom - r.top, hwnd, 0, hInstance, 0); ApplyDialogFont(hwndPropsTabCtrl); propsBitMap = LoadImage(hInstance, "ID_PROPSBMP", IMAGE_BITMAP,0,0,LR_DEFAULTSIZE | LR_LOADMAP3DCOLORS); toolsBitMap = LoadImage(hInstance, "ID_TOOLBOXBMP", IMAGE_BITMAP,0,0,LR_DEFAULTSIZE | LR_LOADMAP3DCOLORS); tabIml = ImageList_Create(16, 16, ILC_COLOR32, 1, 0); ilProps = ImageList_Add(tabIml, propsBitMap, 0); ilToolbox = ImageList_Add(tabIml, toolsBitMap, 0); TabCtrl_SetImageList(hwndPropsTabCtrl, tabIml); CreatePropsWindow(); CreateCtlTbWindow(); tie.mask = TCIF_TEXT | TCIF_IMAGE; tie.iImage = ilProps; tie.pszText = nameTags[0]; TabCtrl_InsertItem(hwndPropsTabCtrl, 0, &tie); tie.mask = TCIF_TEXT | TCIF_IMAGE ; tie.iImage = ilToolbox ; tie.pszText = nameTags[1] ; TabCtrl_InsertItem(hwndPropsTabCtrl,1, &tie) ; ShowWindow(hwndToolbox,SW_HIDE) ; return 0; case WM_COMMAND: break; case WM_SELERRWINDOW: { NMHDR xx; memset(&xx, 0, sizeof(xx)); xx.code = TCN_SELCHANGE; TabCtrl_SetCurSel(hwndPropsTabCtrl, lParam); SendMessage(hwnd, WM_NOTIFY, 0, (LPARAM)&xx); } break; case WM_PAINT: dc = BeginPaint(hwnd, &paint); EndPaint(hwnd, &paint); break; case WM_DESTROY: DestroyWindow(hwndToolbox) ; DestroyWindow(hwndProps); DestroyWindow(hwndPropsTabCtrl); DeleteObject(propsBitMap); DeleteObject(toolsBitMap); hwndPropsTab = 0; break; case WM_SIZE: r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); r.left = r.top = 0; MoveWindow(hwndPropsTabCtrl, r.left, r.top, r.right - r.left, r.bottom - r.top, 1); GetPropsTabRect(&r); MoveWindow(hwndProps, r.left, r.top, r.right - r.left, r.bottom - r.top, 1); MoveWindow( hwndToolbox,r.left,r.top,r.right-r.left,r.bottom-r.top,TRUE) ; break; case WM_CLOSE: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
LRESULT FunctionBPSelectProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { FUNCTIONLIST *list; LV_COLUMN lvC; LV_ITEM item; RECT r; HWND hwndlb; int i; switch (iMessage) { case WM_NOTIFY: if (wParam == IDC_FBPLISTBOX) { if (((LPNMHDR)lParam)->code == NM_DBLCLK) { SendMessage(hwnd, WM_COMMAND, IDC_BMGOTO, 0); } } break; case WM_COMMAND: if (wParam == IDCANCEL) { EndDialog(hwnd, 0); } else if (wParam == IDC_BMGOTO) { int sel = ListView_GetSelectionMark(GetDlgItem(hwnd, IDC_FBPLISTBOX)); if (sel == - 1) { EndDialog(hwnd, 0); break; } item.iItem = sel; item.iSubItem = 0; item.mask = LVIF_PARAM; ListView_GetItem(GetDlgItem(hwnd, IDC_FBPLISTBOX), &item); EndDialog(hwnd, item.lParam); } break; case WM_INITDIALOG: list = (FUNCTIONLIST *)lParam; CenterWindow(hwnd); hwndlb = GetDlgItem(hwnd, IDC_FBPLISTBOX); ApplyDialogFont(hwndlb); GetWindowRect(hwndlb, &r); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM; lvC.cx = r.right - r.left; lvC.iSubItem = 0; ListView_InsertColumn(hwndlb, 0, &lvC); i = 0; while (list) { item.iItem = i++; item.iSubItem = 0; item.mask = LVIF_PARAM | LVIF_TEXT; item.lParam = (LPARAM)list; item.pszText = list->name; ListView_InsertItem(hwndlb, &item); list = list->next; } break; } return 0; }