Tekst w oknie winapi


(K Szandarowski) #1

Witam! Wczoraj przeczytałem kurs Winapi i napisałem swój pierwszy program wyświetlający komunikat. Musze przyznać, że było to bardzo proste, potrafie odnieść się nawet do przycisków np. OK, ANULU, IGNORUJ itd. ale w odniesieniu wyświetlam kolejny komunikat bo innego okna nie napisze. Chciałbym w oknie komunikatu zamieścić przycisk Pomoc a po wybraniu go wyświetlić krótki tekst o programie. Proszę o pomoc w wyświetleniu w takim oto oknie tekstu.

include

/* Declare Windows procedure */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* Make the class name into a global variable */

char szClassName[] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd; /* This is the handle for our window */

MSG messages; /* Here messages to the application are saved */

WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */

wincl.style = CS_DBLCLKS; /* Catch double-clicks */

wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

wincl.lpszMenuName = NULL; /* No menu */

wincl.cbClsExtra = 0; /* No extra bytes after the window class */

wincl.cbWndExtra = 0; /* structure or the window instance */

/* Use Windows's default color as the background of the window */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */

if (!RegisterClassEx (&wincl))

return 0;

/* The class is registered, let's create the program*/

hwnd = CreateWindowEx (

0, /* Extended possibilites for variation */

szClassName, /* Classname */

"Windows App", /* Title Text */

WS_OVERLAPPEDWINDOW, /* default window */

CW_USEDEFAULT, /* Windows decides the position */

CW_USEDEFAULT, /* where the window ends up on the screen */

544, /* The programs width */

375, /* and height in pixels */

HWND_DESKTOP, /* The window is a child-window to desktop */

NULL, /* No menu */

hThisInstance, /* Program Instance handler */

NULL /* No Window Creation data */

);

/* Make the window visible on the screen */

ShowWindow (hwnd, nFunsterStil);

/* Run the message loop. It will run until GetMessage() returns 0 */

while (GetMessage (&messages, NULL, 0, 0))

{

/* Translate virtual-key messages into character messages */

TranslateMessage(&messages);

/* Send message to WindowProcedure */

DispatchMessage(&messages);

}

/* The program return-value is 0 - The value that PostQuitMessage() gave */

return messages.wParam;

}

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message) /* handle the messages */

{

case WM_DESTROY:

PostQuitMessage (0); /* send a WM_QUIT to the message queue */

break;

default: /* for messages that we don't deal with */

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

Proszę nie odsyłać mnie do kursów bo przeczytałem kilka i wiem, że do wyświetlenia tekstu należy użyć TextOut(hdc, x, y, "Tekst wyświetlany",17); wszystko gra ale w którym miejscu tego kodu wstawić, by tekst się wyświetlił? wiem również, że jeszcze wstawić trzeba to:

hdc = BeginPaint( hWnd, &ps );

TextOut(hdc, 10, 20, "Tekst", 5);

EndPaint( hWnd, &ps );

ale gdzie? Przeczytałem kilka kursów ale nie spotkałem się w żadnym by był pokazany przykład takiego okienka z tekstem i to jest wkurzające. Proszę o pomoc


(system) #2

Wiesz jednak trzeba cię do kursów odesłać bo kiepsko przeczytałeś. TextOut służy do rysowania tekstu w okienku. Stwórz nowe okienko a w nim możesz tak rysować. Aby nie tworzyć osobnego okienka można posłużyć się MessageBox API

int Ret=MessageBox

  (

   hwnd, // ten sam co używasz w ShowWindow (

   "Wybierz TAK lub NIE ewentualnie POMOC, możesz też zamknąć ten komunikat krzyżykiem",

   "Twoja decyzja...",

   MB_YESNO | // przyciski TAK i NIE

   MB_DEFBUTTON2 | // drugi przycisk domyślny

   MB_ICONQUESTION | // dodaj ikonkę zapytanie

   MB_HELP | // dodaj przycisk pomoc

   MB_TOPMOST | // na wierzch

   MB_SETFOREGROUND // aktywacja wiadomosci

  );


switch(Ret)

  {

   case IDYES: break; // wybrano TAK

   case IDNO: break; // wybrano NIE

   case IDCANCEL: break; // zamknięto krzyżykiem

  }

Aby wyłapać naciśnięcie przycisku POMOC dodaj do WindowProcedure:

case WM_HELP:

(K Szandarowski) #3

Mam rozumieć, że chodzi ci o to by ten kod który napisałeś umieścić w kodzie w którym ja podałem?


(system) #4

W odpowiedzi na jakieś zdarzenie np na podwójny klik.