Gdi questions(how much is available on object into a device contex?)
1.how much is available on object into a device contex?
i create a pen and select into a device contex(in WM_PANIT) but it draw a line red, only in wm_paint.why this pen is not remain select?i must select evry time,in echy message when i want to draw a line?
2.i'm going to ask later.
L.E.:i draw a line.When i draw another one(superimposed on the first) the R2_NOTXORPEN it delete the "superimposed(overlap) on the first"(it set to white).When WM_LBUTTONUP disappear the white of the overlap of the two lines.I want that the user of my program to see te changes immediately(when the mouse move) not only when left button is up.
Code:
#include <windows.h>
HDC hdc;
const char g_szClassName[] = "myWindowClass";
HPEN hPen,hPenOld;
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int linie=0;
//static i=0;
PAINTSTRUCT ps;
static POINTS ptsIN,ptsOUT,ptsANT;
static COLORREF crRosu;
switch(msg)
{
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hPen=CreatePen(PS_SOLID,0,RGB(255,0,0));
hPenOld=SelectObject(hdc,hPen);
MoveToEx(hdc,20,20,NULL);
LineTo(hdc,100,100);
EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
ptsIN=MAKEPOINTS(lParam);
break;
case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON )
{
ptsOUT=MAKEPOINTS(lParam);
hdc=GetDC(hwnd);
//SetROP2(hdc, R2_NOTXORPEN);
if (linie==1)
//MessageBox(hwnd,"da","daaa",MB_OK);
//ptsIN=MAKEPOINTS(lParam);
{
SetROP2(hdc, R2_NOTXORPEN);
MoveToEx(hdc,ptsIN.x,ptsIN.y,NULL);
LineTo(hdc,ptsANT.x , ptsANT.y);//sterge linia pt a face alta
}
ptsOUT=MAKEPOINTS(lParam);
//SetROP2(hdc,R2_COPYPEN);
MoveToEx(hdc,ptsIN.x,ptsIN.y,NULL);
LineTo(hdc,ptsOUT.x , ptsOUT.y);
ptsANT=ptsOUT;
ReleaseDC(hwnd,hdc);
linie=1;
}
break;
case WM_LBUTTONUP:
hdc=GetDC(hwnd);
//SetROP2(hdc,R2_NOTXORPEN);
//MoveToEx(hdc,ptsIN.x,ptsIN.y,NULL);
//LineTo(hdc,ptsOUT.x , ptsOUT.y);
//SetROP2(hdc, R2_COPYPEN);
MoveToEx(hdc,ptsIN.x,ptsIN.y,NULL);
LineTo(hdc,ptsOUT.x , ptsOUT.y);
linie=0;
ReleaseDC(hwnd,hdc);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
hdc=GetDC(hwnd);
SelectObject(hdc,hPenOld);
DeleteObject(hPen);
ReleaseDC(hwnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Step 2: Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 440, 320,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
sorry for my english