Problema empty project

Acest forum este dedicat intrebarilor de Windows API, folosing C/C++
Post Reply
Raduku077
Junior
Junior
Posts: 20
Joined: 09 Jan 2014, 15:41
Judet: Iaşi

Problema empty project

Post by Raduku077 » 25 Jan 2014, 16:53

Salutare ! Am o problema cu un empty project in Visual Studio 2010 Ultimate .
Atentionarile date de catre compilator sunt scrise in felul acesta.

Codul :


#include <Windows.h>
#include "PrimaFereastra.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWndMain;
MSG msg;
WNDCLASS wndCls;
UNREFERENCED_PARAMETER(lpCmdLine);

wndCls.style = 0;
wndCls.lpfnWndProc = (WNDPROC) WndProc;
wndCls.cbClsExtra = 0;
wndCls.cbWndExtra = 0;
wndCls.hInstance = hInstance;
wndCls.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
wndCls.hCursor = LoadIcon((HINSTANCE) NULL, IDC_ARROW);
wndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndCls.lpszMenuName = 0;
wndCls.lpszClassName = _T("MainWndClass");

if(!RegisterClass(&wndCls))
return false;

hWndMain = CreateWindow("MainWndClass", "Prima Fereastra", WS_OVERLAPPERDWINDOW | WS_HSCROLL | WS_VSCROLL, CW_USERDEFAULT,
CW_USERDEFAULT, CW_USERDEFAULT, CW_USERDEFAULT, (HWND) NULL, (HMENU) NULL, hInstance, (LPVOID) NULL);

if(!hWndMain)
return false;

ShowWindow(hWndMain, nCmdShow);
UpdateWindow(hWndMain);

while(GetMessage(&msg,(HWND) NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CLOSE:
PostMessage(hwnd, WM_QUIT, 0L, 0L);
return DefWindowProc(hwnd, uMsg, wParam, lParam);
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}


Iar erorile sunt :

1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(21): error C3861: '_T': identifier not found
1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(27): error C2065: 'WS_OVERLAPPERDWINDOW' : undeclared identifier
1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(27): error C2065: 'CW_USERDEFAULT' : undeclared identifier
1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(27): error C2065: 'CW_USERDEFAULT' : undeclared identifier
1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(27): error C2065: 'CW_USERDEFAULT' : undeclared identifier
1>d:\teorie\programe windows api\primafereastra\primafereastra\primafereastra.cpp(27): error C2065: 'CW_USERDEFAULT' : undeclared identifier


Chiar daca mentin " _T("MainWndClass ") " sau chiar daca scriu direct " lpszClassName = "MainWndClass" " , atentionarile persista .
Mentionez de asemenea ca nu pot include fisierul antet "stdafx.h" .



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Problema empty project

Post by Ovidiu Cucu » 25 Jan 2014, 19:21

  • pentru _T(...), include <TCHAR.H>
  • WS_OVERLAPPEDWINDOW si nu WS_OVERLAPPERDWINDOW (fara 'R', se refera la "overlapped window", adica o fereastra care sta peste alele);
  • CW_USEDEFAULT si nu CW_USERDEFAULT (tot fara 'R', inseamna "use default" pentru coordonate si dimensiunile ferestrei).
  • StdAfx.h nu-l poti include pentru ca probabil nu-l ai.
Vezi si: Nota: Uneori e bun si copy/paste-ul. :) Din documentatie, bineinteles...

Raduku077
Junior
Junior
Posts: 20
Joined: 09 Jan 2014, 15:41
Judet: Iaşi

Re: Problema empty project

Post by Raduku077 » 27 Jan 2014, 00:07

Multumesc ! A fost doar o chestie de neatentie . Doar " include <TCHAR.H>" reprezenta un necunoscut .

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Problema empty project

Post by Ovidiu Cucu » 30 Jan 2014, 14:46

Raduku077 wrote:Doar " include <TCHAR.H>" reprezenta un necunoscut .
In C/C++ stringurile se reprezinta sau ca siruri de char-uri (ANSI), sau ca siruri de wchar_t-uri (UNICODE).
  • char este un caracter reprezentat pe un byte.
  • wchar_t (wide character) depinde de implementare (compilator), iar compilatorul din Visual C++ il reprezinta pe 2 bytes.
UNICODE s-a introdus pentru a face posibila reprezentarea mai multor caractere decat se pot reprezenta pe un byte (sa luam de exemplu limba chineza).
Standardul Unicode defineste mai multe tipuri de reprezentari: UTF-8 (pe un numar variabil de bytes), UTF-16 (pe 2 bytes, similar cu UNICODE in Windows) si UTF-32 (pe 4 bytes, din cate stiu eu similar cu UNICODE pe MAC).

In biblioteca C standard cat si in alte biblioteci (ex. Windows API) exista functii "pereche", unele dintre ele lucrand cu stringuri ANSI, celelalte cu stringuri UNICODE.
Exemplu: strcpy (ANSI) si wcscpy (UNICODE).
Ca sa fie posibil ca acelasi cod sa poata fi compilat atat in versiunea ANSI cat si UNICODE, headerul TCHAR.H defineste o serie de macro-uri, cam asa:

Code: Select all

#ifdef  _UNICODE
// ...
#define _tcscpy     wcscpy
// ...
#else 
// ...
#define _tcscpy     strcpy
// ...
#endif
Acuma, daca includ TCHAR.H, folosesc in cod _tcscpy si am definit _UNICODE, dupa preprocesare rezulta wcscpy. Daca nu am definit _UNICODE, rezulta strcpy.

De asemenea, versiunea UNICODE pentru character, respectiv string literals este prefixata cu L.
Exemplu:
"Ala bala portocala" este un string literal ANSI, pe cand L"Ala bala portocala" este UNICODE.
La fel, ca sa putem compila acelasi cod sau ANSI sau UNICODE, in TCHAR.H exista macro-ul TEXT sau _T.
Adica, din _T("Ala bala portocala") rezulta dupa preprocesare L"Ala bala portocala" sau "Ala bala portocala" daca am sau nu am _UNICODE definit.

Pentru lamurire, poti arunca un ochi in MSDN la oricare functie CRT care lucreaza cu stringuri. De exemplu la strcpy, wcscpy vei da si peste acel macro _tcscpy definit in TCHAR.H.
Vezi si: viewtopic.php?f=31&t=859

Raduku077
Junior
Junior
Posts: 20
Joined: 09 Jan 2014, 15:41
Judet: Iaşi

Re: Problema empty project

Post by Raduku077 » 31 Jan 2014, 02:42

Multumesc ! Primesc cu bratele deschise informatiile .

Post Reply