» »

[win c++] NONCLIENTMETRICS struktura

[win c++] NONCLIENTMETRICS struktura

zhigatsey ::

Živjo,

Uporabljam Windows Xp SP2 Imam problem pri naslednji kodi, ki sem jo prevedel s
MSVS2008 in z CG C++ Builder 2007 in ne dela nikjer.... Čeprav mi koda v Delphiju
deluje in mislim da zato, ker so pri MS-ju pri Visti malo spremenili strukturo
NONCLIENTMETRICS. Dodali so ji še (int iPaddedBorderWidth)... In to je v BCB compilerju
tudi pravilno deklarirano:

typedef struct tagNONCLIENTMETRICSA
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTA lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTA lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTA lfMenuFont;
    LOGFONTA lfStatusFont;
    LOGFONTA lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */


V delphiju pa je struktura definirana še brez iPaddedBorderWidth... in zgleda takole:

  tagNONCLIENTMETRICSA = packed record
    cbSize: UINT;
    iBorderWidth: Integer;
    iScrollWidth: Integer;
    iScrollHeight: Integer;
    iCaptionWidth: Integer;
    iCaptionHeight: Integer;
    lfCaptionFont: TLogFontA;
    iSmCaptionWidth: Integer;
    iSmCaptionHeight: Integer;
    lfSmCaptionFont: TLogFontA;
    iMenuWidth: Integer;
    iMenuHeight: Integer;
    lfMenuFont: TLogFontA;
    lfStatusFont: TLogFontA;
    lfMessageFont: TLogFontA;
  end;


Zatorej mi sizeof(NONCLIENTMETRICS) v cpp-ju vrne 344 v delphiju pa 340 in zato mi v delphiju
stvar tudi deluje v cpp pa ne... oz. v cpp-ju bi stvar tudi delovala, če mi ne bi upošteval
še iPaddedBorderWidth... ker #if(WINVER >= 0x0600) mi vrne true... Torej zakaj mi prevajalnik
sam ne pogrunta pravega os-a ki ga uporabljam v mojem primeru win xp torej WINVER 0x0501?

#include "stdafx.h"
#include <windows.h>
#include <iostream>

int main(int argc, char* argv[])
{
    NONCLIENTMETRICS ncm;
    memset(&ncm, 0, sizeof(NONCLIENTMETRICS));
    ncm.cbSize = sizeof(NONCLIENTMETRICS);

    #if(WINVER >= 0x0600)
    std::cout << "Ali uporabljam visto ali kako?" << std::endl;
    #endif

    if ( SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, &ncm, 0) )
    {
        std::cout << "Yes" << std::endl;
    }
    else
    {
        std::cout << "No" << std::endl;
    }
    
    system("PAUSE");

    return 0;
}


Hvala za odgovore

BlueRunner ::

Zato, ker lahko na (skoraj) poljubni verziji oken prevajaš programe za (skoraj) poljubno drugo verzijo oken. Prevajanja pač != zaganjanje.

Programerjeva odgovornost je, da sam določi WINVER, ker se s tem zavaruje pred nenamerno uporabo API-jev, ki spadajo v višjo verzijo oken, kot jih pa za svojo aplikacijo zahteva.

zhigatsey ::

Uf v ta WINVER in WIN32_WINNT, se nikoli nisem prav poglabljal, res pa je da tudi z WINAPI nisem imel še dosti
opravka... Zdaj deluje in stvar je čisto logična:)... Pri MSVS2008 sem v stdafx dodal nove define stavke, pri CG C++ Builder pa obstaja nastavitev Windows Version Target:)... Sicer pa ne vem zakaj je po defaultu WINVER nastavljen na najvišjo vrednost...

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
!

Vse, kar ste si želeli vprašati o CSS, pa si niste upali. (strani: 1 2 3 423 24 25 26 )

Oddelek: Izdelava spletišč
1298347469 (6606) sunniegoldie
»

[Android] Splošno

Oddelek: Programiranje
352013 (1143) piki12
»

Vb 2005 - TextBox - Izračun števila vrstic?

Oddelek: Izdelava spletišč
81615 (1490) smash
»

glow efekt s css v FF / dinamicen width s CSS v FF

Oddelek: Izdelava spletišč
181569 (1411) Lee_Nover
»

Kako se tole naredi?

Oddelek: Izdelava spletišč
261508 (1208) njok

Več podobnih tem