PDA

Просмотр полной версии : GDI+ Native Template


Ivan_64
11.12.2009, 06:40
Честно-говоря я просто набиваю сообщения что б увидеть чат:)
Но пытаюсь это сделать наиболее культурным способом. В архиве то что в названии темы и еще несколько заморочек, родительский класс контролов и класс edit - его child собственно.
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
//Усовершенствованная версия метода включения WinXP контролов.


#pragma comment(lib,"gdiplus.lib")
#pragma comment(lib,"Ws2_32.lib")
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>


#include <windows.h>
#include <ddraw.h>
#include <stdio.h>
#include <gdipluspixelformats.h>
#include <gdiplusenums.h>
#include <GdiplusTypes.h>
#include <GdiplusGpStubs.h>
#include <gdiplusimaging.h>
#include <gdiplusmetaheader.h>
#include <gdipluscolor.h>
#include <gdipluscolormatrix.h>
#include <GdiPlusFlat.h>
#include <GdiPlusInit.h>
Эта последовательность инлкудов обязательна - менять нельзя. Собственно это все что нужно для работы с GDI+.

Начнемс:
Пишем в WinMain инициализацию самого GDI+-а

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Далее едем к wndProc-у

case WM_PAINT:
{
BeginPaint(hWnd,&ps);
OnPaint();
EndPaint(hWnd,&ps);
}return 0;

Собственно это все - дальше в OnPaint-е можете делать все что захотите, но в данном случае реализована двойна-буфферизация:

case WM_CREATE:
{
InitializeGraphics(GetWindowDC(hWnd));
InvalidateRect(hWnd,0,true);
}return 0;

void InitializeGraphics(HDC hdc)
{
GdipCreateFromHDC(hdc,&graphics);
GdipCreateBitmapFromGraphics(Window_w,Window_h,gra phics,&bmpBack);
GdipGetImageGraphicsContext(bmpBack,&memGraphics);
GdipSetSmoothingMode(memGraphics,SmoothingModeAnti Alias);
GdipCreatePen1(Color::Black,1.0f,UnitPixel,&pen0);
}

void OnPaint()
{
GdipGraphicsClear(memGraphics,0xFFA0A0A0);
GdipDrawRectangle(memGraphics,pen0,4.0f,4.0f,595.0 f,101.0f);
GdipDrawImagePointRectI(graphics,bmpBack,8,30,0,0, Window_w,Window_h,UnitPixel);
};


Остальные части программы - заготовки для чего либо. Я не очень силен в С++ потому программа и не была допилена - на ассемблере все это реализуется в пару раз легче.