[Programmation Windows] GetSystemMetrics ! Metrics qui foirent !

GetSystemMetrics ! Metrics qui foirent ! [Programmation Windows] - C++ - Programmation

Marsh Posté le 12-12-2002 à 20:23:30    

Voilà. Je suis en train d'apprendre la prog Windows (sans MFC) et j'ai ce programme d'exemple qui consiste à afficher une série de métriques. J'ai fait un copier-coller des sources et à la compilation sous VC++, j'ai ces metrics là qui ne sont pas reconnues.
 
SM_MOUSEWHEELPRESENT, SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN,  SM_CMONITORS, SM_SAMEDISPLAYFORMAT.
 
Les autres passent bien. Faut-il inclure des libs particulières ou autre ?


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 20:23:30   

Reply

Marsh Posté le 12-12-2002 à 20:58:06    

Ces symboles sont définis dans des blocs conditionnels.
Essaie de définir WINVER = 0x0500 dans ton projet :
 
#define WINVER 0x0500


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 21:07:49    

Il me renvoie un warning supplémentaire.
 
c:\program files\microsoft visual studio\myprojects\sysmets\sysmets.h(2) : warning C4005: 'WINVER' : macro redefinition


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 21:09:25    

Voilà le programme :
 
sysmets.h

Code :
  1. #define NUMLINES ((int)(sizeof sysmetrics / sizeof sysmetrics [0]))
  2. struct
  3. {
  4. int iIndex;
  5. TCHAR *szLabel;
  6. TCHAR *szDesc;
  7. }
  8. sysmetrics [] =
  9. {
  10. SM_CXSCREEN, TEXT("SM_CXSCREEN" ), TEXT("Screen width in pixels" ),
  11. SM_CYSCREEN, TEXT("SM_CYSCREEN" ), TEXT("Screen height in pixels" ),
  12. SM_CXVSCROLL, TEXT("SM_CXVSCROLL" ), TEXT("Vertical scroll width" ),
  13. SM_CYHSCROLL, TEXT("SM_CYHSCROLL" ), TEXT("Horizontal scroll height" ),
  14. SM_CYCAPTION, TEXT("SM_CYCAPTION" ), TEXT("Caption bar height" ),
  15. SM_CXBORDER, TEXT("SM_CXBORDER" ), TEXT("Window border width" ),
  16. SM_CYBORDER, TEXT("SM_CYBORDER" ), TEXT("Window border height" ),
  17. SM_CXFIXEDFRAME, TEXT("SM_CXFIXEDFRAME" ), TEXT("Dialog window frame width" ),
  18. SM_CYFIXEDFRAME, TEXT("SM_CYFIXEDFRAME" ), TEXT("Dialog window frame height" ),
  19. SM_CYVTHUMB, TEXT("SM_CYVTHUMB" ), TEXT("Vertical scroll thumb height" ),
  20. SM_CXHTHUMB, TEXT("SM_CXHTHUMB" ), TEXT("Horizontal scroll thumb width" ),
  21. SM_CXICON, TEXT("SM_CXICON" ), TEXT("Icon width" ),
  22. SM_CYICON, TEXT("SM_CYICON" ), TEXT("Icon height" ),
  23. SM_CXCURSOR, TEXT("SM_CXCURSOR" ), TEXT("Cursor width" ),
  24. SM_CYCURSOR, TEXT("SM_CYCURSOR" ), TEXT("Cursor height" ),
  25. SM_CYMENU, TEXT("SM_CYMENU" ), TEXT("Menu bar height" ),
  26. SM_CXFULLSCREEN, TEXT("SM_CXFULLSCREEN" ), TEXT("Full screen client area width" ),
  27. SM_CYFULLSCREEN, TEXT("SM_CYFULLSCREEN" ), TEXT("Full screen client area height" ),
  28. SM_CYKANJIWINDOW, TEXT("SM_CYKANJIWINDOW" ), TEXT("Kanji window height" ),
  29. SM_MOUSEPRESENT, TEXT("SM_MOUSEPRESENT" ), TEXT("Mouse present flag" ),
  30. SM_CYVSCROLL, TEXT("SM_CYVSCROLL" ), TEXT("Vertical scroll arrow height" ),
  31. SM_CXHSCROLL, TEXT("SM_CXHSCROLL" ), TEXT("Horizontal scroll arrow width" ),
  32. SM_DEBUG, TEXT("SM_DEBUG" ), TEXT("Debug version flag" ),
  33. SM_SWAPBUTTON, TEXT("SM_SWAPBUTTON" ), TEXT("Mouse buttons swapped flag" ),
  34. SM_CXMIN, TEXT("SM_CXMIN" ), TEXT("Minimum window width" ),
  35. SM_CYMIN, TEXT("SM_CYMIN" ), TEXT("Minimum window height" ),
  36. SM_CXSIZE, TEXT("SM_CXSIZE" ), TEXT("Min/Max/Close button width" ),
  37. SM_CYSIZE, TEXT("SM_CYSIZE" ), TEXT("Min/Max/Close button height" ),
  38. SM_CXSIZEFRAME, TEXT("SM_CXSIZEFRAME" ), TEXT("Window sizing frame width" ),
  39. SM_CYSIZEFRAME, TEXT("SM_CYSIZEFRAME" ), TEXT("Window sizing frame height" ),
  40. SM_CXMINTRACK, TEXT("SM_CXMINTRACK" ), TEXT("Minimum window tracking width" ),
  41. SM_CYMINTRACK, TEXT("SM_CYMINTRACK" ), TEXT("Minimum window tracking height" ),
  42. SM_CXDOUBLECLK, TEXT("SM_CXDOUBLECLK" ), TEXT("Double click x tolerance" ),
  43. SM_CYDOUBLECLK, TEXT("SM_CYDOUBLECLK" ), TEXT("Double click y tolerance" ),
  44. SM_CXICONSPACING, TEXT("SM_CXICONSPACING" ), TEXT("Horizontal icon spacing" ),
  45. SM_CYICONSPACING, TEXT("SM_CYICONSPACING" ), TEXT("Vertical icon spacing" ),
  46. SM_MENUDROPALIGNMENT, TEXT("SM_MENUDROPALIGNMENT" ), TEXT("Left or right menu drop" ),
  47. SM_PENWINDOWS, TEXT("SM_PENWINDOWS" ), TEXT("Pen extensions installed" ),
  48. SM_DBCSENABLED, TEXT("SM_DBCSENABLED" ), TEXT("Double-Byte Char Set enabled" ),
  49. SM_CMOUSEBUTTONS, TEXT("SM_CMOUSEBUTTONS" ), TEXT("Number of mouse buttons" ),
  50. SM_SECURE, TEXT("SM_SECURE" ), TEXT("Security present flag" ),
  51. SM_CXEDGE, TEXT("SM_CXEDGE" ), TEXT("3-D border width" ),
  52. SM_CYEDGE, TEXT("SM_CYEDGE" ), TEXT("3-D border height" ),
  53. SM_CXMINSPACING, TEXT("SM_CXMINSPACING" ), TEXT("Minimized window spacing width" ),
  54. SM_CYMINSPACING, TEXT("SM_CYMINSPACING" ), TEXT("Minimized window spacing height" ),
  55. SM_CXSMICON, TEXT("SM_CXSMICON" ), TEXT("Small icon width" ),
  56. SM_CYSMICON, TEXT("SM_CYSMICON" ), TEXT("Small icon height" ),
  57. SM_CYSMCAPTION, TEXT("SM_CYSMCAPTION" ), TEXT("Small caption height" ),
  58. SM_CXSMSIZE, TEXT("SM_CXSMSIZE" ), TEXT("Small caption button width" ),
  59. SM_CYSMSIZE, TEXT("SM_CYSMSIZE" ), TEXT("Small caption button height" ),
  60. SM_CXMENUSIZE, TEXT("SM_CXMENUSIZE" ), TEXT("Menu bar button width" ),
  61. SM_CYMENUSIZE, TEXT("SM_CYMENUSIZE" ), TEXT("Menu bar button height" ),
  62. SM_ARRANGE, TEXT("SM_ARRANGE" ), TEXT("How minimized windows arranged" ),
  63. SM_CXMINIMIZED, TEXT("SM_CXMINIMIZED" ), TEXT("Minimized window width" ),
  64. SM_CYMINIMIZED, TEXT("SM_CYMINIMIZED" ), TEXT("Minimized window height" ),
  65. SM_CXMAXTRACK, TEXT("SM_CXMAXTRACK" ), TEXT("Maximum draggable width" ),
  66. SM_CYMAXTRACK, TEXT("SM_CYMAXTRACK" ), TEXT("Maximum draggable height" ),
  67. SM_CXMAXIMIZED, TEXT("SM_CXMAXIMIZED" ), TEXT("Width of maximized window" ),
  68. SM_CYMAXIMIZED, TEXT("SM_CYMAXIMIZED" ), TEXT("Height of maximized window" ),
  69. SM_NETWORK, TEXT("SM_NETWORK" ), TEXT("Network present flag" ),
  70. SM_CLEANBOOT, TEXT("SM_CLEANBOOT" ), TEXT("How system was booted" ),
  71. SM_CXDRAG, TEXT("SM_CXDRAG" ), TEXT("Avoid drag x tolerance" ),
  72. SM_CYDRAG, TEXT("SM_CYDRAG" ), TEXT("Avoid drag y tolerance" ),
  73. SM_SHOWSOUNDS, TEXT("SM_SHOWSOUNDS" ), TEXT("Present sounds visually" ),
  74. SM_CXMENUCHECK, TEXT("SM_CXMENUCHECK" ), TEXT("Menu check-mark width" ),
  75. SM_CYMENUCHECK, TEXT("SM_CYMENUCHECK" ), TEXT("Menu check-mark height" ),
  76. SM_SLOWMACHINE, TEXT("SM_SLOWMACHINE" ), TEXT("Slow processor flag" ),
  77. SM_MIDEASTENABLED, TEXT("SM_MIDEASTENABLED" ), TEXT("Hebrew and Arabic enabled flag" ),
  78. SM_MOUSEWHEELPRESENT, TEXT("SM_MOUSEWHEELPRESENT" ), TEXT("Mouse wheel present flag" ),
  79. SM_XVIRTUALSCREEN, TEXT("SM_XVIRTUALSCREEN" ), TEXT("Virtual screen x origin" ),
  80. SM_YVIRTUALSCREEN, TEXT("SM_YVIRTUALSCREEN" ), TEXT("Virtual screen y origin" ),
  81. SM_CXVIRTUALSCREEN, TEXT("SM_CXVIRTUALSCREEN" ), TEXT("Virtual screen width" ),
  82. SM_CYVIRTUALSCREEN, TEXT("SM_CYVIRTUALSCREEN" ), TEXT("Virtual screen height" ),
  83. SM_CMONITORS, TEXT("SM_CMONITORS" ), TEXT("Number of monitors" ),
  84. SM_SAMEDISPLAYFORMAT, TEXT("SM_SAMEDISPLAYFORMAT" ), TEXT("Same color format flag" )
  85. };


et sysmets.c

Code :
  1. #include <windows.h>
  2. #include "sysmets.h"
  3. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  5. {
  6. static TCHAR szAppName[] = TEXT("SysMets1" );
  7. HWND hwnd;
  8. MSG msg;
  9. WNDCLASS wndclass;
  10. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  11. wndclass.lpfnWndProc = WndProc;
  12. wndclass.cbClsExtra = 0;
  13. wndclass.cbWndExtra = 0;
  14. wndclass.hInstance = hInstance;
  15. wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  16. wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  17. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  18. wndclass.lpszMenuName = NULL;
  19. wndclass.lpszClassName = szAppName;
  20. if (!RegisterClass (&wndclass)) 
  21. {
  22.  MessageBox (NULL, TEXT("This program requires Windows NT!" ), szAppName, MB_ICONERROR);
  23.  return 0;
  24. }
  25. hwnd = CreateWindow(
  26.  szAppName,
  27.  TEXT("Get System Metrics No. 1" ),
  28.  WS_OVERLAPPEDWINDOW,
  29.  CW_USEDEFAULT,
  30.  CW_USEDEFAULT,
  31.  CW_USEDEFAULT,
  32.  CW_USEDEFAULT,
  33.  NULL,
  34.  NULL,
  35.  hInstance,
  36.  NULL);
  37. ShowWindow(hwnd, iCmdShow);
  38. UpdateWindow(hwnd);
  39. while (GetMessage(&msg, NULL, 0, 0))
  40. {
  41.  TranslateMessage (&msg);
  42.  DispatchMessage (&msg);
  43. }
  44. return msg.wParam;
  45. }
  46. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  47. {
  48. static int cxChar, cxCaps, cyChar;
  49. HDC hdc;
  50. int i;
  51. PAINTSTRUCT ps;
  52. TCHAR szBuffer[10];
  53. TEXTMETRIC tm ;
  54. switch (message)
  55. {
  56. case WM_CREATE:
  57.  hdc = GetDC (hwnd);
  58.  GetTextMetrics (hdc, &tm);
  59.  cxChar = tm.tmAveCharWidth;
  60.  cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
  61.  cyChar = tm.tmHeight + tm.tmExternalLeading;
  62.  ReleaseDC (hwnd, hdc);
  63.  return 0;
  64. case WM_PAINT:
  65.  hdc = BeginPaint (hwnd, &ps) ;
  66.  for (i = 0 ; i < NUMLINES ; i++)
  67.  {
  68.   TextOut(hdc, 0, cyChar * i, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
  69.   TextOut(hdc, 22 * cxCaps, cyChar * i, sysmetrics[i].szDesc, lstrlen (sysmetrics[i].szDesc));
  70.   SetTextAlign (hdc, TA_RIGHT | TA_TOP);
  71.   TextOut(hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer, wsprintf (szBuffer, TEXT ("%5d" ), GetSystemMetrics (sysmetrics[i].iIndex)));
  72.   SetTextAlign (hdc, TA_LEFT | TA_TOP);
  73.  }
  74.  EndPaint (hwnd, &ps);
  75.  return 0;
  76. case WM_DESTROY:
  77.  PostQuitMessage(0);
  78.  return 0;
  79. }
  80. return DefWindowProc (hwnd, message, wParam, lParam);
  81. }


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 21:17:10    

WINVER est défini dans StdAfx.h
Si tu le redéfinis dans ton header, ça va pas aller :)
 
remplace la valeur de StdAfx.h par 0x0500, ça devrait aller !
 
:hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 22:41:42    

Harkonnen a écrit :

WINVER est défini dans StdAfx.h
Si tu le redéfinis dans ton header, ça va pas aller :)
 
remplace la valeur de StdAfx.h par 0x0500, ça devrait aller !
 
:hello:

Tu veux que je modifie LE stdAfx.h ! ! ! C'est autorisé ça ?


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 22:44:04    

Cherrytree a écrit :

Tu veux que je modifie LE stdAfx.h ! ! ! C'est autorisé ça ?


absolument, tu ne risques rien du tout !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 22:44:55    

Cherrytree a écrit :

Tu veux que je modifie LE stdAfx.h ! ! ! C'est autorisé ça ?

Euh, j'ai pas de stdAfx.h pour ce projet. C'est pas un projet MFC. C'est p'têt pour ça ?


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 22:46:38    

Cherrytree a écrit :

Euh, j'ai pas de stdAfx.h pour ce projet. C'est pas un projet MFC. C'est p'têt pour ça ?


exact !
mais WINVER est quand même défini quelque part sinon tu n'aurais pas le warning.
cherche le dans un de tes headers. normalement, il doit être à 0x0400. passe le à 0x0500, et les portes du paradis te seront ouvertes ;)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 22:48:57    

Harkonnen a écrit :


exact !
mais WINVER est quand même défini quelque part sinon tu n'aurais pas le warning.
cherche le dans un de tes headers. normalement, il doit être à 0x0400. passe le à 0x0500, et les portes du paradis te seront ouvertes ;)

Tu n'aurais pas une idée du header, parce que Windows.h !!! c'est bourré d'includes !


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 22:48:57   

Reply

Marsh Posté le 12-12-2002 à 22:49:47    

Cherrytree a écrit :

Tu n'aurais pas une idée du header, parce que Windows.h !!! c'est bourré d'includes !

C'était dans Windows.h justement ;) !


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 22:51:45    

Je serais toi, je modifierais pas ton windows.h !
 
Il définit peut être WINVER mais uniquement si il n'est pas défini avant. Mets tout simplement ton "#define WINVER 0x0500' avant ton '#include <windows.h>'.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 12-12-2002 à 22:52:26    

Par contr, peux-tu m'en dire plus sur la raison de ce mic-mac ?
 
ça marche, grace à toi, mais en revanche j'obtiens ce message : NOTE: WINVER has been defined as 0x0500 or greater which enables
Windows NT 5.0 and Windows 98 features. When these headers were released,
Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.
For this release when WINVER is defined as 0x0500 or greater, you can only
build beta or test applications.  To build a retail application,
set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk
to see if retail Windows NT 5.0 or Windows 98 headers are available.
See the SDK release notes for more information.
 
:??:


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 22:55:46    

Tu doit avoir le Platform SDK livré avec Visual Studio 6, non ?
 
Si c'est ça, il te faut télécharger le dernier, ici  http://www.microsoft.com/msdownloa [...] sdkupdate/


---------------
each day I don't die is cheating
Reply

Marsh Posté le 12-12-2002 à 22:58:25    

Cherrytree a écrit :

Par contr, peux-tu m'en dire plus sur la raison de ce mic-mac ?
 
ça marche, grace à toi, mais en revanche j'obtiens ce message : NOTE: WINVER has been defined as 0x0500 or greater which enables
Windows NT 5.0 and Windows 98 features. When these headers were released,
Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.
For this release when WINVER is defined as 0x0500 or greater, you can only
build beta or test applications.  To build a retail application,
set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk
to see if retail Windows NT 5.0 or Windows 98 headers are available.
See the SDK release notes for more information.
 
:??:


tu as un platform SDK assez ancien, sorti à l'époque ou les symboles que tu décris ne fonctionnait que sur des bétas de Win 2000.
passer WINVER à 0x0500 te permet d'activer les features de 2000.
par contre, je te conseille de récupérer un nv SDK
 
edit : grilled


Message édité par Harkonnen le 12-12-2002 à 22:59:52

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 23:02:07    

par contre, pour éviter de toucher aux headers, ce qui est assez bourrin je te l'accorde, tu peux faire ceci :
 
Project->Settings->Onglet "C/C++"->dans le combo "Category", tu sélectionnes "Général" et dans le champ "Preprocessor definitions tu ajoutes "WINVER = 0x0500"
 
:hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 12-12-2002 à 23:21:09    

Cool ! Merci pour tout !


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 23:24:55    

Je suppose que c'est le Core SDK que je dois installer. C'est grave si c'est celui de .Net ?


---------------
Le site de ma maman
Reply

Marsh Posté le 12-12-2002 à 23:29:52    

Cherrytree a écrit :

C'est grave si c'est celui de .Net ?


 
Non, le '.Net', c'est juste pour faire de la pub !


---------------
each day I don't die is cheating
Reply

Marsh Posté le 12-12-2002 à 23:51:09    

gatorette a écrit :


 
Non, le '.Net', c'est juste pour faire de la pub !

Cool ! Merci pour tout. J'm'en serais pas sorti seul. Une dernière pour la route : est-ce qu'il existe une page web sur les conventions relatives à Visual C++ ou la programmation Windows en général, recommandée par M$ ou autre (mais pas par Robert ou Jacquot sur son site perso chez Wanadoo, bien sûr).


---------------
Le site de ma maman
Reply

Marsh Posté le 13-12-2002 à 00:01:21    

Je sais que la plupart du temps l'API Windows utilise la notation Hongroise. De là à dire que c'est une recommendation...  :??:


---------------
each day I don't die is cheating
Reply

Marsh Posté le 13-12-2002 à 00:39:34    

gatorette a écrit :

Je sais que la plupart du temps l'API Windows utilise la notation Hongroise. De là à dire que c'est une recommendation...  :??:  

[:totozzz] Je savais pas que la notation hongroise venait à l'origine d'un chercheur de M$.


---------------
Le site de ma maman
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed