📄 ldmicro.cpp
字号:
}
break;
case 'S':
if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
SaveProgram();
UpdateMainWindowTitleBar();
} else {
CHANGING_PROGRAM(MakeSetOnlySelected());
}
break;
case 'N':
if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
if(CheckSaveUserCancels()) break;
if(!ProgramChangedNotSaved) {
int r = MessageBox(MainWindow,
_("Start new program?"),
"LDmicro", MB_YESNO | MB_DEFBUTTON2 |
MB_ICONQUESTION);
if(r == IDNO) break;
}
NewProgram();
strcpy(CurrentSaveFile, "");
strcpy(CurrentCompileFile, "");
GenerateIoListDontLoseSelection();
RefreshScrollbars();
UpdateMainWindowTitleBar();
} else {
CHANGING_PROGRAM(NegateSelected());
}
break;
case 'A':
CHANGING_PROGRAM(MakeNormalSelected());
break;
case 'T':
CHANGING_PROGRAM(AddTimer(ELEM_RTO));
break;
case 'O':
if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
if(CheckSaveUserCancels()) break;
OpenDialog();
} else {
CHANGING_PROGRAM(AddTimer(ELEM_TON));
}
break;
case 'F':
CHANGING_PROGRAM(AddTimer(ELEM_TOF));
break;
case 'U':
CHANGING_PROGRAM(AddCounter(ELEM_CTU));
break;
case 'I':
CHANGING_PROGRAM(AddCounter(ELEM_CTD));
break;
case 'J':
CHANGING_PROGRAM(AddCounter(ELEM_CTC));
break;
case 'M':
CHANGING_PROGRAM(AddMove());
break;
case 'P':
CHANGING_PROGRAM(AddReadAdc());
break;
case VK_OEM_PLUS:
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(AddMath(ELEM_ADD));
} else {
CHANGING_PROGRAM(AddCmp(ELEM_EQU));
}
break;
case VK_OEM_MINUS:
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
} else {
CHANGING_PROGRAM(AddMath(ELEM_SUB));
}
break;
case '8':
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(AddMath(ELEM_MUL));
}
break;
case 'D':
CHANGING_PROGRAM(AddMath(ELEM_DIV));
break;
case VK_OEM_PERIOD:
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(AddCmp(ELEM_GRT));
} else {
CHANGING_PROGRAM(AddCmp(ELEM_GEQ));
}
break;
case VK_OEM_COMMA:
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(AddCmp(ELEM_LES));
} else {
CHANGING_PROGRAM(AddCmp(ELEM_LEQ));
}
break;
case 'V':
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(InsertRung(TRUE));
}
break;
case '6':
if(GetAsyncKeyState(VK_SHIFT) & 0x8000) {
CHANGING_PROGRAM(InsertRung(FALSE));
}
break;
case 'Z':
if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
UndoUndo();
}
break;
case 'Y':
if(GetAsyncKeyState(VK_CONTROL) & 0x8000) {
UndoRedo();
}
break;
default:
break;
}
if(wParam != VK_SHIFT && wParam != VK_CONTROL) {
InvalidateRect(MainWindow, NULL, FALSE);
}
break;
}
case WM_LBUTTONDBLCLK: {
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if(InSimulationMode) {
EditElementMouseDoubleclick(x, y);
} else {
CHANGING_PROGRAM(EditElementMouseDoubleclick(x, y));
}
InvalidateRect(MainWindow, NULL, FALSE);
break;
}
case WM_LBUTTONDOWN: {
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if((y > (IoListTop - 9)) && (y < (IoListTop + 3))) {
POINT pt;
pt.x = x; pt.y = y;
ClientToScreen(MainWindow, &pt);
MouseY = pt.y;
MouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL,
(HOOKPROC)MouseHook, Instance, 0);
}
if(!InSimulationMode) MoveCursorMouseClick(x, y);
SetFocus(MainWindow);
InvalidateRect(MainWindow, NULL, FALSE);
break;
}
case WM_MOUSEMOVE: {
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if((y > (IoListTop - 9)) && (y < (IoListTop + 3))) {
SetCursor(LoadCursor(NULL, IDC_SIZENS));
} else {
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
break;
}
case WM_MOUSEWHEEL: {
if((GET_WHEEL_DELTA_WPARAM(wParam)) > 0) {
VscrollProc(SB_LINEUP);
} else {
VscrollProc(SB_LINEDOWN);
}
break;
}
case WM_SIZE:
MainWindowResized();
break;
case WM_NOTIFY: {
NMHDR *h = (NMHDR *)lParam;
if(h->hwndFrom == IoList) {
IoListProc(h);
}
return 0;
}
case WM_VSCROLL:
VscrollProc(wParam);
break;
case WM_HSCROLL:
HscrollProc(wParam);
break;
case WM_COMMAND:
ProcessMenu(LOWORD(wParam));
InvalidateRect(MainWindow, NULL, FALSE);
break;
case WM_CLOSE:
case WM_DESTROY:
if(CheckSaveUserCancels()) break;
PostQuitMessage(0);
return 1;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 1;
}
//-----------------------------------------------------------------------------
// Create our window class; nothing exciting.
//-----------------------------------------------------------------------------
static BOOL MakeWindowClass()
{
WNDCLASSEX wc;
memset(&wc, 0, sizeof(wc));
wc.cbSize = sizeof(wc);
wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC |
CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.hInstance = Instance;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszClassName = "LDmicro";
wc.lpszMenuName = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
IMAGE_ICON, 32, 32, 0);
wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
IMAGE_ICON, 16, 16, 0);
return RegisterClassEx(&wc);
}
//-----------------------------------------------------------------------------
// Entry point into the program.
//-----------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, INT nCmdShow)
{
Instance = hInstance;
MainHeap = HeapCreate(0, 1024*64, 0);
MakeWindowClass();
MakeDialogBoxClass();
HMENU top = MakeMainWindowMenus();
MainWindow = CreateWindowEx(0, "LDmicro", "",
WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX |
WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX,
10, 10, 800, 600, NULL, top, Instance, NULL);
ThawWindowPos(MainWindow);
IoListHeight = 100;
ThawDWORD(IoListHeight);
InitCommonControls();
InitForDrawing();
MakeMainWindowControls();
MainWindowResized();
NewProgram();
strcpy(CurrentSaveFile, "");
// Check if we're running in non-interactive mode; in that case we should
// load the file, compile, and exit.
while(isspace(*lpCmdLine)) {
lpCmdLine++;
}
if(memcmp(lpCmdLine, "/c", 2)==0) {
RunningInBatchMode = TRUE;
char *err =
"Bad command line arguments: run 'ldmicro /c src.ld dest.hex'";
char *source = lpCmdLine + 2;
while(isspace(*source)) {
source++;
}
if(*source == '\0') { Error(err); exit(-1); }
char *dest = source;
while(!isspace(*dest) && *dest) {
dest++;
}
if(*dest == '\0') { Error(err); exit(-1); }
*dest = '\0'; dest++;
while(isspace(*dest)) {
dest++;
}
if(*dest == '\0') { Error(err); exit(-1); }
if(!LoadProjectFromFile(source)) {
Error("Couldn't open '%s', running non-interactively.", source);
exit(-1);
}
strcpy(CurrentCompileFile, dest);
GenerateIoList(-1);
CompileProgram(FALSE);
exit(0);
}
// We are running interactively, or we would already have exited. We
// can therefore show the window now, and otherwise set up the GUI.
ShowWindow(MainWindow, SW_SHOW);
SetTimer(MainWindow, TIMER_BLINK_CURSOR, 800, BlinkCursor);
if(strlen(lpCmdLine) > 0) {
char line[MAX_PATH];
if(*lpCmdLine == '"') {
strcpy(line, lpCmdLine+1);
} else {
strcpy(line, lpCmdLine);
}
if(strchr(line, '"')) *strchr(line, '"') = '\0';
char *s;
GetFullPathName(line, sizeof(CurrentSaveFile), CurrentSaveFile, &s);
if(!LoadProjectFromFile(CurrentSaveFile)) {
NewProgram();
Error(_("Couldn't open '%s'."), CurrentSaveFile);
CurrentSaveFile[0] = '\0';
}
UndoFlush();
}
GenerateIoListDontLoseSelection();
RefreshScrollbars();
UpdateMainWindowTitleBar();
MSG msg;
DWORD ret;
while(ret = GetMessage(&msg, NULL, 0, 0)) {
if(msg.hwnd == IoList && msg.message == WM_KEYDOWN) {
if(msg.wParam == VK_TAB) {
SetFocus(MainWindow);
continue;
}
}
if(msg.message == WM_KEYDOWN && msg.wParam != VK_UP &&
msg.wParam != VK_DOWN && msg.wParam != VK_RETURN && msg.wParam
!= VK_SHIFT)
{
if(msg.hwnd == IoList) {
msg.hwnd = MainWindow;
SetFocus(MainWindow);
}
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
FreezeWindowPos(MainWindow);
FreezeDWORD(IoListHeight);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -