ahoj, čtu si recenzi o vyvoji aplikaci do windowsu. http://www.radekchalupa.cz/clanky/?kod=214&obsah=1 a je tam kod kterej by měl vypsat určitej text. Bohužel se mi to nevypíš. může to být tím, že mam 64bitovy procesor? Nemáte někdo lepší tutoriál? Díky.
Fórum › C / C++
Win 32 API
Ok, budu hledat chybu jinde ... mrkl by jses na to prosím?
Btw. je dobré učit se v win 32 api?
Díky!
//v main.h mám #include <windows.h>
#include "main.h"
#define _MainClassName TEXT("WinAPIMainClass")
#define _AppName TEXT("Učíme se WinAPI")
HINSTANCE g_hInstance;
HWND g_hwndMain;
typedef char CHAR;
typedef wchar_t WCHAR;
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR;
#else
typedef char TCHAR, *PTCHAR;
#endif
TEXT(
LPTSTR string // ANSI or Unicode string
);
LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch ( uMsg )
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
BOOL InitApp()
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = g_hInstance;
wc.lpfnWndProc = WindowProcMain;
wc.lpszClassName = _MainClassName;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
if ( !RegisterClassEx(&wc) )
return FALSE;
g_hwndMain = CreateWindowEx(0, _MainClassName,
_AppName,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 450, 350,
NULL, NULL, g_hInstance, NULL);
if ( g_hwndMain == NULL )
return FALSE;
return TRUE;
}
MSG msg;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShow)
{
g_hInstance = hInstance;
if ( !InitApp() )
return FALSE;
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void OnWM_PAINT()
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR chText[] = TEXT("Ahoj Win API !");
hdc = BeginPaint(g_hwndMain, &ps);
TextOut(hdc, 10, 10, chText, lstrlen(chText));
EndPaint(g_hwndMain, &ps);
}
LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch ( message )
{
case WM_PAINT:
OnWM_PAINT();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
To radvis :
Podle mě ne, když už tu jsou věci jako WPF.
To radvis :
Jestli má cenu učit se Win 32 API? Když se ptáš takto obecně, tak nemá (i když ho sám používám).
Otázka spíš je, jestli to má cenu pro tebe. Chceš pochopit princip (když ses na něj před časem ptal)? Chceš vědět, jak to vlastně funguje? A proč? Jednoduše řečeno, záleží na tom, čeho chceš dosáhnout ...
Udělat aplikaci ve Win32 API není o nic složitější než v čemkoliv jiném (když chápeš princip), ale určitě to bude časově více náročné.
m->29 napsal:
Možno keby si tam nemal 2krát tú istú fukciu :smile5:Zoberie to tú prvú v ktorej vôbec nemáš zachytenú správu WM_PAINT, ak ti to teda vôbec ide skompilovať :smile13:LRESULT CALLBACK WindowProcMain(...)
Nejde "se to provede", ale nic se nestane. Skusil jsem dat pryc tu první, ale nejde to:( . Nemohl by jsi mi to opravit prosim? Díky.
netusim jak to delas ale me to jede s timdle naprosto v pohode... v cem a jak kompilujes? co ti hlasi prekladac? :
#include <windows.h>
#define _MainClassName TEXT("WinAPIMainClass")
#define _AppName TEXT("Učíme se WinAPI")
HINSTANCE g_hInstance;
HWND g_hwndMain;
typedef char CHAR;
typedef wchar_t WCHAR;
MSG msg;
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR;
#else
typedef char TCHAR, *PTCHAR;
#endif
TEXT(
LPTSTR string // ANSI or Unicode string
);
LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL InitApp()
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = g_hInstance;
wc.lpfnWndProc = WindowProcMain;
wc.lpszClassName = _MainClassName;
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
if ( !RegisterClassEx(&wc) )
return FALSE;
g_hwndMain = CreateWindowEx(0, _MainClassName,
_AppName,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 450, 350,
NULL, NULL, g_hInstance, NULL);
if ( g_hwndMain == NULL )
return FALSE;
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShow)
{
g_hInstance = hInstance;
if ( !InitApp() )
return FALSE;
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void OnWM_PAINT()
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR chText[] = TEXT("Ahoj Win API !");
hdc = BeginPaint(g_hwndMain, &ps);
TextOut(hdc, 10, 10, chText, lstrlen(chText));
EndPaint(g_hwndMain, &ps);
}
LRESULT CALLBACK WindowProcMain(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch ( message )
{
case WM_PAINT:
OnWM_PAINT();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
To KIIV : Aha, ted jsem si všiml chyby. In function 'LRESULT WindowProcMain(HWND_*, UINT, WPARAM, LPARAM)':, 'OnWM_PAINT' was not declared in this scope, In function 'int WinMain(HINSTANCE_*, HINSTANCE_*, CHAR*, int)':, 'msg' was not declared in this scope (to tam je 2x pod sebou).
nemyslis ze bude lepsi zacit zakladama C ? takhle u winapi zdechnes nez cokoliv rozjedes...
deklarace funkce:
int funkce(int param1, int param2);
nebo taky jen: int funkce(int,int);
jen rikas prekladaci: "bude tu funkce funkce ktera prijima dva parametry typu int a vraci taktez int"
definice funkce:
int funkce(int param1, int param2) {
return param1*param2;
}
a definice uz musi obsahovat i co ta funkce vlastne ma delat.. na zacatku muzes dat deklaraci a na konec pak definici...
(pripadne deklarace do hlavickoveho souboru a definice do samostatneho zdrojaku.. akorat se to pak musi spravne slinkovat)
ted ti staci vse v jednom
To m->29 : Nemám to před tím.
#include <windows.h>
#define _MainClassName TEXT("WinAPIMainClass")
#define _AppName TEXT("Učíme se WinAPI")
HINSTANCE g_hInstance;
HWND g_hwndMain;
typedef char CHAR;
typedef wchar_t WCHAR;
MSG msg;
void OnWM_PAINT();
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR;
#else
typedef char TCHAR, *PTCHAR;
#endif
To radvis : Co ještě chci? :-)
Chtěl jsem ti pomoci vyřešit tvůj problém, aby se ti lépe spalo. Podle toho tutorialu to dělal KIIV a funguje mu to. Tobě to nefunguje. Jakou chybou to končí nepíšeš. Tak jsem chtěl vědět, jestli je problém v nastavení projektu nebo jestli je problém mezi klávesnicí a židlí :-) ...
Prostě aby ti to programování neznechutil hello world příklad.
To liborb : kdyby jen podle tutorialu.. sem vzal ten jeho kod tady na zacatku trochu usporadal a bezi naprosto bez problemu... (tj vyhodil tu dvoji definici a tak)
stahni si to za***** dev-c++, vytvor projekt (windows aplication, C ), a tam nakopiruj ten kod..
nevim v cem a jak to kompilujes ale evidentne to delas blbe
EDIT: jeste sem zkusil cisty mingw a gcc program.c se zkompiloval naprosto bez problemu
tak kdyz sem zkusil soubor.c v codeblocks tak to hodilo tu hlasku jak si rikal...
kdyz sem si dal zalozit projekt pro win a do toho napasoval kod tak to bezi uplne bez problemu
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
Win 32 api Dialogy — založil whysper
Win API - Listbox — založil FP91
WIN API WM_PAINT — založil unk
Win 32 API - Podokno — založil FanatiK
Moderátoři diskuze