Home » Tutorials » Systemnahe Programmierung » nonVCL

nonVCL

Dialoge, die einfachere Alternative?

Nimmt man nun ein simples Beispiel für ein Programm, das exakt die gleiche Funktion hat, jedoch auf einer Dialog-Vorlage aufbaut, so sieht der Quelltext entsprechend simpler aus:

program Test2;
uses windows,
  messages;

{$WARNINGS OFF}
{$HINTS OFF}
{$R main.res} //hier kommt die Vorlage rein

var
  hdlg: DWORD = 0;

function dlgfunc(hwnd: hwnd; umsg: dword; wparam: wparam;
 lparam: lparam): bool; stdcall;
begin
  result := true;
  CASE umsg OF
    WM_CLOSE:
      EndDialog(hWnd, 0);
    WM_DESTROY:
      PostQuitMessage(0);
    WM_COMMAND:
      IF hiword(wparam) = BN_CLICKED THEN BEGIN
        CASE loword(wparam) OF
          IDOK:
            sendmessage(hwnd, WM_CLOSE, 0, 0);
        end;
      end;
  else result := false;
  end;
end;

begin
  hdlg := DialogBoxParam(HInstance, MAKEINTRESOURCE(100), 0, @DlgFunc, 0);
end.

Download des Beispiels (10 KB)
Der einzig neue Aufruf hier ist:

hdlg := DialogBoxParam(HInstance, MAKEINTRESOURCE(100), 0, @DlgFunc, 0);

Damit wird aus der Ressource mit der ID 100 der Dialog erzeugt. Eine Fensterprozedur zugewiesen und automatisch die Nachrichtenschleife [Messageloop] gestartet.
Was man an dieser Stelle leidlich gut sieht, ist das Einbinden der Dialog-Vorlage. Dies geschieht durch das Einbinden der MAIN.RES. Diese kompilierte Ressourcendatei wird mithilfe des Resourcecompiler [BRCC32.EXE] aus einem „Resource script“ kompiliert.
In unserem Falle sieht das Skript wie folgt aus:

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

100 DIALOGEX 6, 18, 264, 85
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
CAPTION „Fenster-Caption“
FONT 8, „Arial“
BEGIN
PUSHBUTTON „OK“, IDOK, 61, 65, 140, 14
END

Der Aufruf BRCC32 main.rc main.res erzeugt aus dem Skript das Kompilat.
Zum Bearbeiten eines Resource Scripts existieren diverse Tools. Empfehlenswert ist der Editor aus MS Visual C++ sowie das Freewareprodukt WEDIT, das zu VIDE einer C-IDE gehört.

WEDIT im Einsatz