📄 ccide.c
字号:
item.iSubItem = 0;
item.mask = LVIF_PARAM;
ListView_GetItem(GetDlgItem(hwnd, IDC_FILELIST), &item);
SendMessage(hwndClient, WM_MDIACTIVATE, (WPARAM)item.lParam,
0);
DeleteObject(hfont);
EndDialog(hwnd, IDOK);
}
}
return 0;
case WM_COMMAND:
switch (wParam &0xffff)
{
case IDCANCEL:
DeleteObject(hfont);
EndDialog(hwnd, IDCANCEL);
break;
}
break;
case WM_CLOSE:
PostMessage(hwnd, WM_COMMAND, IDCANCEL, 0);
break;
}
return 0;
}
//-------------------------------------------------------------------------
void ShowWindowList(void)
{
DialogBoxParam(hInstance, "DLG_MANYWINDOWS", 0, (DLGPROC)WindowShowProc, 0);
}
//-------------------------------------------------------------------------
BOOL CALLBACK winmenEnumProc(HWND window, LPARAM param)
{
HANDLE hsub = (HANDLE)param;
MENUITEMINFO mi;
if (GetParent(window) != hwndClient)
return TRUE;
if (!IsWindowVisible(window))
return TRUE;
if (winMenuCount == 0)
{
memset(&mi, 0, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIIM_TYPE;
mi.fType = MFT_SEPARATOR;
InsertMenuItem(hsub, WindowItemCount, TRUE, &mi);
}
memset(&mi, 0, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mi.fType = MFT_STRING;
if (winMenuCount == MAX_WINMENU)
{
mi.wID = IDM_WINDOW_MORE;
mi.dwTypeData = "More Windows...";
InsertMenuItem(hsub, 1+winMenuCount + WindowItemCount, TRUE, &mi);
return FALSE;
}
else
{
GetWindowText(window, windowTexts[winMenuCount], 60);
mi.dwTypeData = &windowTexts[winMenuCount][0];
mi.wID = ID_WINDOW_LIST + winMenuCount;
InsertMenuItem(hsub, 1+winMenuCount + WindowItemCount, TRUE, &mi);
winMenu[winMenuCount] = window;
winMenuCount++;
return TRUE;
}
}
//-------------------------------------------------------------------------
void SetWindowMenu(void)
{
HANDLE hsub = GetSubMenu(hMenuMain, WINDOW_MENU_OFFSET);
int count = GetMenuItemCount(hsub);
int i;
for (i = WindowItemCount; i < count; i++)
DeleteMenu(hsub, WindowItemCount, MF_BYPOSITION);
winMenuCount = 0;
EnumChildWindows(hwndClient, winmenEnumProc, (LPARAM)hsub);
}
//-------------------------------------------------------------------------
UINT GetMenuCheckedState(int Id)
{
return !!(GetMenuState(hMenuMain, Id, MF_BYCOMMAND) &MF_CHECKED);
}
//-------------------------------------------------------------------------
void SetMenuCheckedState(int did, int id)
{
MENUITEMINFO info;
info.cbSize = sizeof(MENUITEMINFO);
info.fMask = MIIM_STATE;
GetMenuItemInfo(hMenuMain, id, MF_BYCOMMAND, &info);
info.fState = (info.fState &~MFS_CHECKED) | (dmgrGetHiddenState(did) ? 0 :
MFS_CHECKED);
SetMenuItemInfo(hMenuMain, id, MF_BYCOMMAND, &info);
}
//-------------------------------------------------------------------------
LRESULT CALLBACK _export WndProc(HWND hwnd, UINT iMessage, WPARAM wParam,
LPARAM lParam)
{
LRESULT rv;
static int timerid;
PROJLIST *proj;
int sel;
CLIENTCREATESTRUCT csx;
static DEBUG_EVENT *dbe;
static int initted;
HWND win;
int mf_state, x_state;
RECT rs, rf;
RECT rp, rt;
POINT pt;
int parts[4], i;
LPTOOLTIPTEXT lpt;
char *name;
PROJLIST *plist;
char module[256];
int linenum;
HDWP deferstruct;
char buf[256];
int selstart, selend;
switch (iMessage)
{
case WM_WINDOWPOSCHANGING:
// Keeps it from drawing a smaller window prior to the initial
// ShowWindow....
if (!readytodraw)
{
((LPWINDOWPOS)lParam)->flags |= SWP_NOREDRAW;
}
break;
case WM_ACTIVATE:
// check if edit windows changed
if (LOWORD(wParam) != WA_INACTIVE)
CheckEditWindowChanged();
// first activation, init all the windows
if (!initted)
{
initted = TRUE;
MakeToolBar(hwnd);
CreateErrorWindow();
CreateTabWindow();
CreateWatchWindow();
CreateASMWindow();
CreateDumpWindow();
CreateStackWindow();
CreateThreadWindow();
CreateSourceTabWindow();
CreateRegisterWindow();
dmgrSetInfo(initialIDs, initialDocks, INITIAL_DOCK_COUNT);
RestoreDocksFromRegistry();
SendMessage(hwnd, WM_REDRAWTOOLBAR, 0, 0);
}
break;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
{
PostMessage(hwnd, WM_COMMAND, IDM_EXIT, 0);
return 0;
}
break;
case WM_EXCEPTION:
dmgrHideWindow(DID_ASMWND, FALSE);
dbe = (DEBUG_EVENT*)lParam;
if (!GetBreakpointLine((DWORD)dbe
->u.Exception.ExceptionRecord.ExceptionAddress, &module,
&linenum))
dmgrHideWindow(DID_ASMWND, FALSE);
else
ApplyBreakAddress(module, linenum);
if (hwndASM)
SendMessage(hwndASM, WM_COMMAND, ID_SETADDRESS, lParam);
SendMessage(hwndError, WM_SETTEXT, ERR_DEBUG_WINDOW, (LPARAM)
exceptval(dbe->u.Exception.ExceptionRecord.ExceptionCode));
SendMessage(hwndError, WM_SETTEXT, ERR_DEBUG_WINDOW, (LPARAM)"\r\n")
;
ExtendedMessageBox("Exception", MB_SYSTEMMODAL, "%s", exceptval(dbe
->u.Exception.ExceptionRecord.ExceptionCode));
break;
case WM_PARENTNOTIFY:
break;
case WM_BREAKPOINT:
dbe = (DEBUG_EVENT*)lParam;
if (uState != notDebugging)
{
if (!GetBreakpointLine((DWORD)dbe
->u.Exception.ExceptionRecord.ExceptionAddress, &module,
&linenum))
dmgrHideWindow(DID_ASMWND, FALSE);
else
ApplyBreakAddress(module, linenum);
if (hwndASM)
SendMessage(hwndASM, WM_COMMAND, ID_SETADDRESS, lParam);
}
break;
case WM_CREATE:
if (IsDebuggerPresent())
SetWindowText(hwnd, "CC386 IDE (DEBUGEE)");
csx.hWindowMenu = hMenuMain;
csx.idFirstChild = IDM_FIRSTCHILD;
hwndStatus = CreateStatusWindow(WS_VISIBLE | WS_CHILD, "", hwnd,
ID_STATUS_WINDOW);
GetClientRect(hwnd, &rf);
hwndClient = CreateWindowEx(0, "MDICLIENT", 0, WS_CHILD +
WS_CLIPCHILDREN + WS_VISIBLE | MDIS_ALLCHILDSTYLES | WS_BORDER,
rf.left, rf.top, rf.right - rf.left, rf.bottom - rf.top, hwnd,
0, hInstance, &csx);
SendMessage(hwndClient, WM_MDISETMENU, (WPARAM)hMenuMain, (LPARAM)
GetSubMenu(hMenuMain, ProjectsMenuItem));
parts[0] = rf.right - 340;
parts[1] = rf.right - 260;
parts[2] = rf.right - 180;
parts[3] = rf.right - 100;
parts[4] = rf.right - 20;
SendMessage(hwndStatus, SB_SETPARTS, 5, (LPARAM) &parts[0]);
SendMessage(hwndStatus, SB_SETTEXT, 0 | SBT_NOBORDERS, (LPARAM)
" ");
dmgrInit(hInstance, hwnd, hwndClient, 20);
dmgrAddStatusBar(hwndStatus);
break;
case WM_HELP:
if (GetKeyState(VK_CONTROL) &0x80000000)
PostMessage(hwnd, WM_COMMAND, IDM_CONTEXTHELP, 0);
else
PostMessage(hwnd, WM_COMMAND, IDM_CCIDEHELP, 0);
break;
case WM_COMMAND:
switch (wParam &0xffff)
{
case IDM_WINHELP:
ShowHelp(0);
break;
case IDM_TOOLSHELP:
strcpy(buf, szInstallPath);
strcat(buf, "\\help\\tools.hlp");
WinHelp(hwnd, buf, HELP_CONTENTS, 0);
break;
case IDM_CCIDEHELP:
strcpy(buf, szInstallPath);
strcat(buf, "\\help\\ccide.hlp");
WinHelp(hwnd, buf, HELP_CONTENTS, 0);
break;
case IDM_ADDWATCH:
if (uState != atBreakpoint && uState != atException)
break;
name = DialogBoxParam(hInstance, "ADDWATCHDIALOG", hwnd,
(DLGPROC)WatchAddProc, 0);
if (name)
SendMessage(hwndWatch, WM_ADDWATCH, StoppedThread->regs.Eip,
(LPARAM)name);
break;
case IDM_ADDWATCHINDIRECT:
if (uState != atBreakpoint && uState != atException)
break;
if (IsWindow(win = (HWND)SendMessage(hwndClient,
WM_MDIGETACTIVE, 0, 0)) && !IsSpecialWindow(win))
SendMessage(hwndWatch, WM_ADDWATCHINDIRECT, (WPARAM)win, 0);
break;
case IDM_DELETEWATCH:
if (uState != atBreakpoint && uState != atException)
break;
SendMessage(hwndWatch, iMessage, wParam, lParam);
break;
#ifdef HBREAK
case IDM_HBREAK:
hbpDialog();
break;
#endif
case IDM_STARTSTOP:
i = SendMessage(hwndToolDebug, TB_GETSTATE, IDM_STARTSTOP, 0);
if (!(i &TBSTATE_CHECKED))
{
abortDebug();
break;
}
// fall through
case IDM_STARTDEBUGGING:
if (uState != notDebugging)
break;
dbgRebuildMain(wParam);
break;
case IDM_STOPDEBUGGING:
if (uState == notDebugging)
break;
abortDebug();
break;
case IDM_STEPIN:
if (uState != notDebugging && uState != Running)
{
StepIn(dbe);
if (hwndASM)
InvalidateRect(hwndASM, 0, 1);
}
break;
case IDM_RUN:
case IDM_RUNF5:
if (uState != notDebugging && uState != Running)
{
SaveRegisterContext();
ReleaseSemaphore(BreakpointSem, 1, 0);
if (hwndASM)
InvalidateRect(hwndASM, 0, 1);
}
else if (uState == notDebugging)
{
PostMessage(hwnd, WM_COMMAND, IDM_STARTDEBUGGING, 0);
}
break;
case IDM_STOP:
if (uState != Running)
break;
StopRunning(nullState);
break;
case IDM_STEPOVER:
if (uState != notDebugging && uState != Running)
{
StepOver(dbe);
if (hwndASM)
InvalidateRect(hwndASM, 0, 1);
}
break;
case IDM_STEPOUT:
if (uState != notDebugging && uState != Running)
{
StepOut(dbe);
if (hwndASM)
InvalidateRect(hwndASM, 0, 1);
}
break;
case IDM_RUNTO:
if (RunTo(dbe))
{
if (hwndASM)
InvalidateRect(hwndASM, 0, 1);
}
break;
case IDM_BREAKPOINT:
SetBP(dbe);
break;
case IDM_VIEWBUILDBAR:
x_state = GetMenuCheckedState(IDM_VIEWBUILDBAR);
dmgrHideWindow(DID_BUILDTOOL, x_state);
break;
case IDM_VIEWEDITBAR:
x_state = GetMenuCheckedState(IDM_VIEWEDITBAR);
dmgrHideWindow(DID_EDITTOOL, x_state);
break;
case IDM_VIEWDEBUGBAR:
x_state = GetMenuCheckedState(IDM_VIEWDEBUGBAR);
dmgrHideWindow(DID_DEBUGTOOL, x_state);
break;
case IDM_VIEWSTACK:
dmgrHideWindow(DID_STACKWND, FALSE);
break;
case IDM_VIEWTHREAD:
dmgrHideWindow(DID_THREADWND, FALSE);
break;
case IDM_VIEWASM:
dmgrHideWindow(DID_ASMWND, FALSE);
break;
case IDM_VIEWDUMP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -