Zdravim, nasel jsem zde na foru jedno vlakno, tykajici se OKNA.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
TCHAR szAppName[] = TEXT("UOC - BS Counter");
HWND hWnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = NULL;
wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;
RegisterClassEx(&wc);
hWnd = CreateWindowEx(0,szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
Toto je kod, prilozeny nekterymi uzivateli. Mam dotaz, jak zmenim vysku okna? Jak zmenim barvu okna, pokud chci treba obrazek, nebo zelenou. Kam mam psat kod, pokud se jedna o text, ktery chci vlozit do okna. A nakonec jak udelat aktivni odkaz na dalsi cast programu, tzn, ze mam okno ve kterem mam napriklad text Zpravy a pod tim Novinky a kdyz kliknu na zpravy, hodi me to do "dalsi mistnosti" a tam se objevi ty zpravy...
Fórum › C / C++
Okno 2
aha, diky moc
jeste bych chtel vedet kam muzu napsat to TEXTOUT do jake casti
a proc je tam 4x
CW_USEDEFAULT,
to jako ze za to neco muzu kdyztak dosadit?
To Hanz.S : Konstanty CW_USEDEFAULT ve fci CreateWindowEX; první značí vzdálenost okna od levého okraje obrazovky (x), druhá značí vzdálenost od horní strany obrazovky (y), třetí značí šířku okna, čtvrtá výšku => stačí změnit hodnotu místo CW_USEDEFAULT třeba 640, nebo to je jedno co :)
To Hanz.S : v proceduře okna
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
TextOut(....);
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
To Hanz.S : a jo máš pravdu, taky mi to dělalo problémy... pak jsem to teda vyřešil takto
case WM_PAINT:
OnWM_PAINT();
break;
a fce
void OnWM_PAINT()
{
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(g_hwnd, &ps);
TextOut(hDC, 10, 10, "ahoj", 16);
EndPaint(g_hwnd, &ps);
}
Je docela dobrý se kouknout do MSDN (http://msdn.microsoft.com/en-us/library/d06h2x6e(VS.71).aspx)- tam najdeš všechno: př. textout je v Graphics and Multimedia->Windows GDI->Fonts and Text->Fonts and Text Reference->Fonts and Text Functions (http://msdn.microsoft.com/en-us/library/ms534019(VS.85).aspx)..........tam se dá najít všechno
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
TCHAR szAppName[] = TEXT("UOC - BS Counter");
HWND hWnd;
MSG msg;
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = NULL;
wc.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW-3);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;
RegisterClassEx(&wc);
hWnd = CreateWindowEx(0,szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
300,
150,
640,
300,
NULL,
NULL,
hInstance,NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
OnWM_PAINT();
break;
void OnWM_PAINT()
{
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(g_hwnd, &ps);
TextOut(hDC, 10, 10, "ahoj", 16);
EndPaint(g_hwnd, &ps);
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
Totoz je kod, kterej tam mam. Jestli najdete chybu sem sni.
To Hanz.S : je tam více chyb
1) funkci OnVM_PAINT() nemůžeš definovat ve fci WinMain ale až za ní....
2) chybí prototyp fce void OnVM_PAINT() před fcí WinMain
jak tak koukám tak by si měl začít spíše se standardní knihovnou cpp a ne hned win api
toto je kód vygenerovanej v CodeBlocks při vytvoření nového WinAPI projektu doplněnej o obsluhu zprávy WM_PAINT......funguje bez problémů
#include <windows.h>
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "CodeBlocksWindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
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 colour 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 */
"Code::Blocks Template 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, nCmdShow);
/* 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_PAINT:
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(hwnd, &ps);
TextOut(hDC, 10, 10, "ahoj", 4);
EndPaint(hwnd, &ps);
break;
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;
}
když jsem zkusil zkompilovat ten samej kód, z kterýho jsem to sem kopíroval, tak mi to udělalo to samý co tobě, ale když jsem vytvořil nový projekt a přidal do něj znovu obsluhu WM_PAINT tak to fungovalo, jenže když jsem CodeBlocks zavřel a znovu otevřel, tak to už nešlo!!....je to nějaký divný
tady je část kódu vygenerovanýho ve Visual C++ 6.0
// bbb.cpp : Defines the entry point for the application.
#include "stdafx.h"
#include "resource.h"
#define MAX_LOADSTRING 100
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
}
ten pro změnu používá pro vypsání textu funkci DrawText
důležitý je, že ty kódy jsou víceméně správně a ty si musíš umět přizpůsobit
Nechci bejt otravnej, ale teď mi to nebere
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
stdafx.h: No such file or directory.
resource.h: No such file or directory.
`LRESULT' does not name a type
expected unqualified-id before '{' token
`,' or `;' before '{' token
expected declaration before '}' token
Ve Visual studiu si otevři New Project -> Win32 Project -> Empty
Kód je následující
#include <windows.h>
#include <tchar.h> // Unicode
/////////////////////////////////////////////////////////////////
// Globální proměné
HINSTANCE g_hInstance;
HWND g_hWnd;
const TCHAR szJmenoAplikace[] = TEXT("TextOut");
/////////////////////////////////////////////////////////////////
// OnWM_PAINT()
void OnWM_PAINT(HWND hWnd)
{
HDC hDC = GetDC(hWnd);
SetBkMode(hDC, TRANSPARENT); // Průhledné pozadí textu
TextOut(hDC, 10, 10, _T("Ahoj"), 4);
ReleaseDC(hWnd, hDC);
}
/////////////////////////////////////////////////////////////////
// Zpracování zpráv
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
OnWM_PAINT(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//////////////////////////////////////////////////////////////////
// Registrace třídy okna a vytvoření okna
BOOL Inicializace()
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = g_hInstance;
wcex.hIcon = NULL;
wcex.hIconSm = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szJmenoAplikace;
if(!RegisterClassEx(&wcex))
return FALSE;
g_hWnd = CreateWindowEx(0, szJmenoAplikace, TEXT("TextOut"),
WS_OVERLAPPEDWINDOW,
100, 50, 400, 300,
(HWND)NULL,
(HMENU)NULL,
g_hInstance,
NULL);
if(!g_hWnd)
return FALSE;
ShowWindow(g_hWnd, SW_SHOW);
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// Hlavní fce programu
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpmCmdLine, int nCmdShow)
{
MSG msg;
g_hInstance = hInstance;
if(!Inicializace())
return -1;
// Hlavní smyčka zpráv
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
Nechci ti do toho kecat, ale copy&paste neni zrovna nejlepší metoda, jak se naučit programovat.
cO to jak se ucim programovat se nemusis bat. Ja po vas nechci novej kod, chci jen vedet kde je chyba a vy mi tu davate kody ...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Okno v C++ — založil Algon
Okno - tabuľka — založil Monkey
Okno na pozadi — založil Scrat
1. okno reaguje na 2. — založil Anonymní uživatel
Pop Up okno — založil tonez
Moderátoři diskuze