Notepad API
Posted on March 9, 2010, 10:25 pm UTC by Iago Sousa (about 1 year ago)Code (highlighted for Delphi)
- program notepad;
- uses
- Windows;
- const
- clss = 'notepadAPI001';
- ID_NEW = $1064;
- ID_OPEN = $1065;
- ID_SAVE = $1066;
- ID_EXIT = $1067;
- ID_ALWA = $1068;
- var
- WinClss :TWndClassExA;
- handle, memo :HWND;
- menu, submenu,
- sysmenu :Cardinal;
- menut :TMenuItemInfoA;
- uMsg :TMsg;
- Inst :Cardinal;
- Width :Integer=400;
- Height :Integer=400;
- Text :string='Close';
- Always :Boolean=FALSE;
- function WindowProc(hwnd, uint, wparam, lparam: Integer): integer; stdcall;
- begin
- if (uint=$0010) then
- DestroyWindow(handle);
- if (uint=$0002) then
- begin
- PostQuitMessage(0);
- Halt;
- end;
- if ((uint=$00111) and (uMsg.wParam=ID_NEW)) then
- begin
- Text:='';
- SendMessage(memo, $000C, 0, Integer(Text));
- end;
- if ((uint=$0112) and (uMsg.wParam=ID_SAVE)) then
- SendMessage(handle, $0010, 0, 0);
- if ((uint=$0111) and (uMsg.wParam=ID_ALWA)) then
- begin
- if not Always then
- begin
- menu:=GetMenu(handle);
- FillChar(menut, SizeOf(TMenuItemInfoA), #0);
- menut.cbSize:=SizeOf(TMenuItemInfoA);
- menut.fMask:=MIIM_TYPE or MIIM_ID or MIIM_STATE;
- menut.fType:=MF_STRING;
- menut.fState:=MF_CHECKED;
- menut.wID:=ID_ALWA;
- Text:='&Always on top';
- menut.dwTypeData:=PChar(Text);
- menut.cch:=Length(Text);
- SetMenuItemInfoA(menu, ID_ALWA, false, menut);
- SetWindowPos(Handle, HWND_TOPMOST, CW_USEDEFAULT, CW_USEDEFAULT, Width,
- Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
- Always:= True;
- end
- else
- begin
- menu := GetMenu(handle);
- FillChar(menut, SizeOf(TMenuItemInfoA), #0);
- menut.cbSize := SizeOf(TMenuItemInfoA);
- menut.fMask := MIIM_TYPE or MIIM_ID or MIIM_STATE;
- menut.fType := MF_STRING;
- menut.fState := MF_UNCHECKED;
- menut.wID := ID_ALWA;
- Text := '&Always on top';
- menut.dwTypeData := PChar(Text);
- menut.cch := Length(Text);
- SetMenuItemInfoA(menu, ID_ALWA, false, menut);
- SetWindowPos(Handle, HWND_NOTOPMOST, CW_USEDEFAULT, CW_USEDEFAULT, Width,
- Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
- Always := False;
- end;
- end;
- if ((uint=$0111) and (uMsg.wParam=ID_EXIT)) then
- PostMessage(handle, $0010, 0, 0);
- Result := DefWindowProc(hwnd, uint, wparam, lparam);
- end;
- begin
- with WinClss do
- begin
- cbSize := SizeOf(TWNDCLASSEX);
- style := CS_DBLCLKS;
- lpfnWndProc := @WindowProc;
- cbClsExtra := 0;
- cbWndExtra := 0;
- hInstance := Inst;
- hIcon := LoadIcon(0, IDI_APPLICATION);
- hCursor := LoadCursor(0, IDC_ARROW);
- hbrBackground := COLOR_BACKGROUND;
- lpszMenuName := 0;
- lpszClassName := clss;
- hIconSm := LoadIcon(0, IDI_APPLICATION);
- end;
- RegisterClassEx(WinClss);
- handle := CreateWindowEx(WS_EX_LEFT, clss, 'Notepad API',
- WS_CAPTION or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX or WS_MAXIMIZEBOX,
- CW_USEDEFAULT, CW_USEDEFAULT, Width, Height, HWND_DESKTOP, 0, Inst, nil);
- memo := CreateWindow('edit', '', WS_VISIBLE or WS_CHILD or ES_MULTILINE
- or ES_WANTRETURN or WS_EX_LEFTSCROLLBAR or WS_EX_RIGHTSCROLLBAR or WS_VSCROLL
- or WS_HSCROLL, 0, 0, Width - 7, Width - 48, handle, 0, Inst, nil);
- menu := CreateMenu;
- submenu := CreateMenu;
- sysmenu := GetSystemMenu(handle, false);
- FillChar(menut, SizeOf(TMenuItemInfoA), #0);
- menut.cbSize := SizeOf(TMenuItemInfoA);
- menut.fMask := MIIM_TYPE or MIIM_ID or MIIM_STATE;
- menut.fType := MFT_STRING;
- menut.wID := SC_CLOSE;
- Text := 'Quit';
- menut.dwTypeData := PChar(Text);
- menut.cch := Length(Text);
- SetMenuItemInfoA(sysmenu, SC_CLOSE, false, menut);
- AppendMenuA(submenu, MF_STRING, ID_NEW, '&New');
- AppendMenuA(submenu, MF_STRING, ID_OPEN, '&Open...');
- AppendMenuA(submenu, MF_STRING, ID_EXIT, 'Exit');
- AppendMenuA(menu, MF_STRING or MF_POPUP, submenu, '&File');
- submenu := CreateMenu;
- AppendMenuA(submenu, MF_STRING, ID_ALWA, '&Always on top');
- AppendMenuA(menu, MF_UNCHECKED or MF_POPUP, submenu, '&View');
- SetMenu(handle, menu);
- ShowWindow(handle, SW_SHOWNORMAL);
- UpdateWindow(handle);
- while (GetMessage(uMsg, handle, 0, 0)) do
- begin
- TranslateMessage(uMsg);
- DispatchMessage(uMsg);
- end;
- end.
Comments
Bem pequeno rs