ΠΠΈΡΡΠΈΠ½Π³ 5.5. ΠΠ»Π°ΡΡ BmpViewWin
class BmpViewWin : public DirectDrawWin {
public:
BmpViewWin();
protected:
//{{AFX_MSG(BmpViewWin)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces() {
return TRUE;
}
void DrawScene();
void RestoreSurfaces();
void GetSystemPalette();
void ShowDialog();
BOOL LoadBmp();
void PageUp();
void PageDown();
void Home();
void End();
void Left(int inc=4);
void Right(int inc=4);
void Up(int inc=4);
void Down(int inc=4);
private:
BmpDialog* bmpdialog;
LPDIRECTDRAWPALETTE syspal;
CString fullfilename;
CString filename;
CString pathname;
CRect displayrect;
LPDIRECTDRAWSURFACE bmpsurf;
CRect bmprect;
int x,y;
int xscroll, yscroll;
int xlimit, ylimit;
BOOL update_screen;
DisplayModeArray palettemode, nonpalettemode;
};
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠΊΡΡΡΠΎΠΉ (public) ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΠ΅ΡΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:
β’ OnKeyDown()
β’ OnRButtonDown()
β’ OnCreate()
β’ OnDestroy()
Π€ΡΠ½ΠΊΡΠΈΡ OnKeyDonw() ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ, ΡΡΠ΅Π΄ΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΡΠΎ ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ, Home, End, Page Up, Page Down, Enter, ΠΏΡΠΎΠ±Π΅Π» ΠΈ Escape.
Π€ΡΠ½ΠΊΡΠΈΠΈ OnCreate() ΠΈ OnDestroy() ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠ½ΠΊΡΠΈΡ OnCreate() ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° BMP-ΡΠ°ΠΉΠ»Π°, Π° ΡΡΠ½ΠΊΡΠΈΡ OnDestroy() ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ Π΅Π³ΠΎ.
ΠΠ°Π»Π΅Π΅ ΡΠ»Π΅Π΄ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°ΠΊΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . Π€ΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° Π²Π΅ΡΡΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ DirectDraw AppWizard ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² ΠΏΡΠΎΡΠ»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , Π½ΠΎ Π² Π½Π΅Π΅ Π²Π½Π΅ΡΠ΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. ΠΡΠΎΠΌΠ΅ Π²ΡΠ±ΠΎΡΠ° ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡ ΠΏΠ°Π»ΠΈΡΡΡ Windows Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ GetSystemPalette() (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ Π½ΠΈΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ SelectInitialDisplayMode()).
Π€ΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces() ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π½Π°ΠΌΠΈ, BmpView Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ DirectDrawWin::CreateCustomSurfaces() ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ, Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΅Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ DrawScene() ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π΅Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠΊΡΠ°Π½, ΡΡΠ½ΠΊΡΠΈΡ DrawScene() Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ Π»ΠΈΡΡ Π² ΠΎΡΠ²Π΅Ρ Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄. ΠΡΠΈΠΌ ΠΎΠ½Π° ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΡΠ°Π½ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ»ΡΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎ. Π€ΡΠ½ΠΊΡΠΈΡ RestoreSurfaces() Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΡ ΠΏΠΎΡΠ΅ΡΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ ShowDialog() Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° BMP-ΡΠ°ΠΉΠ»Π°. Π€ΡΠ½ΠΊΡΠΈΡ LoadBmp() ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΌΡ ΠΈΠ· Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ BMP-ΡΠ°ΠΉΠ» Π½Π° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ x, y, xscroll, yscroll, xlimit ΠΈ ylimit. ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ BMP-ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π²ΠΎΡΠ΅ΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠ»Π°Π²ΠΈΡ:
β’ PageUp()
β’ PageDown()
β’ Home()
β’ End()
β’ Left()
β’ Right()
β’ Up()
β’ Down()
ΠΠ»Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΡΠ°ΡΡΡ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»Π°ΡΡ Π²ΡΡΠ΅. ΠΡ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ DirectDraw, ΠΊΠ»Π°ΡΡ DirectDrawWin Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ SelectDriver(), ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΌΠΎΠ³Π»ΠΈ Π²ΡΠ±ΡΠ°ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ DirectDraw ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ². Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ BmpView ΠΌΡ ΠΎΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΡ ΡΡΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΠΎΠΊΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ GDI, Π° GDI ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ (ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ DirectDraw).
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΡΠ°ΠΏΠΎΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ SelectInitialDisplayMode(), ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΎΠ±ΡΠ·Π°Π½Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ. ΠΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ SelectInitialDisplayMode() Π²ΡΠ±ΠΈΡΠ°Π΅Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ 640x480x16. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ Π²Π°ΠΆΠ΅Π½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ BMP-ΡΠ°ΠΉΠ»Π°. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 5.6) Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΄Π²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 5.6. Π€ΡΠ½ΠΊΡΠΈΡ BmpViewWin::SelectInitialDisplayMode()
int BmpViewWin::SelectInitialDisplayMode() {
DisplayModeDescription desc;
int i, nummodes=GetNumDisplayModes();
DWORD w,h,d;
for (i=0;i<nummodes;i++) {
GetDisplayModeDimensions(i, w, h, d);
desc.w=w;
desc.h=h;
desc.d=d;
desc.desc.Format("%dx%dx%d", w, h, d );
if (d==8) palettemode.Add(desc);
else nonpalettemode.Add(desc);
}
DWORD curdepth=GetDisplayDepth();
for (i=0;i>nummodes;i++) {
GetDisplayModeDimensions(i, w, h, d);
if (w==640 && h==480 && d==curdepth) return i;
}
for (i=0;i<nummodes;i++) {
GetDisplayModeDimensions(i, w, h, d);
if (d==curdepth) return i;
}
for (i=0;i>nummodes;i++) {
GetDisplayModeDimensions(i, w, h, d);
if (w==640 && h==480) return i;
}
GetSystemPalette();
return 0;
}
ΠΠΎΠΌΠΈΠΌΠΎ Π²ΡΠ±ΠΎΡΠ° ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π΄Π²ΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²: Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Ρ ΡΠ°Π½ΡΡΡΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΡΡ (palettemode), Π° Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ β ΠΎ Π±Π΅ΡΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΡΡ (nonpalettemode) Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°Ρ . ΠΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠΈΠΌΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅, ΠΏΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΡΠ°ΠΉΠ» Ρ ΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΡΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π² ΡΠΏΠΈΡΠΎΠΊ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΡ; Π΄Π»Ρ Π±Π΅ΡΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΡΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² Π΄Π΅Π»ΠΎ ΠΎΠ±ΡΡΠΎΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ β Π² ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ (ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΡΡΡΡΠΊΡΡΡ DisplayModeDescription) Π²ΠΊΠ»ΡΡΠ΅Π½Ρ ΡΡΡΠΎΠΊΠΈ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠ΅ Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅.
Π€ΡΠ½ΠΊΡΠΈΡ SelectInitialDisplayMode() ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ GetSystemPalette(), ΡΠΎΠ·Π΄Π°ΡΡΠ΅ΠΉ ΠΏΠ°Π»ΠΈΡΡΡ DirectDraw Π½Π° Π±Π°Π·Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΏΠ°Π»ΠΈΡΡΡ. Π€ΡΠ½ΠΊΡΠΈΡ GetSystemPalette() Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
void BmpViewWin::GetSystemPalette() {
PALETTEENTRY pe[256];
HDC dc = ::GetDC(0);
if (GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE) {
GetSystemPaletteEntries(dc, 0, 256, pe);
ddraw2->CreatePalette(DDPCAPS_8BIT, pe, &syspal, 0);
}
::ReleaseDC(0, dc);
}
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Win32 GetSystemPaletteEntries() ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΏΠ°Π»ΠΈΡΡΡ Windows ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎ Π΅Π΅ ΠΎΠ±ΡΠ°Π·ΡΡ ΠΏΠ°Π»ΠΈΡΡΡ DirectDraw ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ CreatePalette() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDraw. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΠ°Π»ΠΈΡΡΡ syspal ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΏΠ°Π»ΠΈΡΡΡ; ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΠΎΠΊΠΎΠ½ Windows Π² 8-Π±ΠΈΡΠ½ΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°Ρ .
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ Π½Π°ΡΠ΅Π³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ, β ΡΡΠ½ΠΊΡΠΈΡ OnCreate(). Π ΡΡΠ½ΠΊΡΠΈΠΈ OnCreate(), ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠ»Π°ΡΡΠΎΠΌ BmpViewWin(), ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°:
int BmpViewWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (DirectDrawWin::OnCreate(lpCreateStruct) == -1) return -1;
ShowDialog();
return 0;
}
ΠΡΠ±ΠΎΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ BMP-ΡΠ°ΠΉΠ»Π°Π€ΡΠ½ΠΊΡΠΈΡ ShowDialog() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ShowDialog() ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Π΅Ρ DirectDraw ΠΊ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ BMP-ΡΠ°ΠΉΠ»Π΅ ΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π°. Π€ΡΠ½ΠΊΡΠΈΡ ShowDialog() ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.7.
ΠΠΈΡΡΠΈΠ½Π³ 5.7. Π€ΡΠ½ΠΊΡΠΈΡ ShowDialog()
void BmpViewWin::ShowDialog() {
CRect displayrect=GetDisplayRect();
if (displayrect.Width()<640) ddraw2->SetDisplayMode(640, 480, 8, 0, 0);
if (GetDisplayDepth()==8) {
ClearSurface(backsurf, 0);
primsurf->SetPalette(syspal);
} else {
BltSurface(backsurf, bmpsurf, x, y);
}
ddraw2->FlipToGDISurface();
ShowCursor(TRUE);
if (bmpdialog==0) {
bmpdialog=new BmpDialog();
bmpdialog->SetArrays(&palettemode, &nonpalettemode);
}
if (bmpdialog->DoModal()==IDCANCEL) {
PostMessage(WM_CLOSE);
return;
}
fullfilename=bmpdialog->fullfilename;
filename=bmpdialog->filename;
pathname=bmpdialog->pathname;
int index=bmpdialog->GetIndex();
DWORD w,h,d;
if (bmpdialog->FilePalettized()) {