/*--------------------------FUNKTIONS-DEKLARATIONER-------------------------*/ void aINIT(HWND hThis); //Vid skapande av fönster void aLMBD(HWND hThis,LPARAM lThis); //Vänster musknapp void aLMBU(HWND hThis,LPARAM lThis); //Vänster musknapp släppt void aMENU(HWND hThis,WPARAM wThis); //Menyval void aMV(LPARAM lThis); //Musen rör sig void aNEW(HWND hThis); //"Nytt projekt" i menyn void aQUIT(HWND hThis); //"Avsluta" i menyn void aUPDATE(HWND hThis); //När omritning behövs /*-----------------------------MENY-KONSTANTER------------------------------*/ // (Numrering av menyval sker i resursfilen) const int nNEW = 101; //Nytt projekt const int nEXIT = 102; //Avsluta const int nPENRED = 201; //Röd penfärg const int nPENGREEN = 202; //Grön penfärg const int nPENBLUE = 203; //Blå penfärg const int nPENSELECT = 204; //Färgpalett const int nBOX = 301; //Rektangel const int nCIRCLE = 302; //Cirkel const int nFREEHAND = 303; //Frihand const int nLINE = 304; //Linje const int nTEXTSTAMP = 305; //Textstämpel const int nTEXT = 401; //Välj text att stämpla const int nFONT = 402; //Välj typsnitt const int nHELP = 501; //Hjälp const int nABOUT = 502; //Information /*-------------------------GLOBALA RIT-VARIABLER----------------------------*/ bool bDrawing = false; //TRUE om vi ritar char cDrawingStyle = 'F'; //Ritstil (Default=frihand) int nSizeX = GetSystemMetrics(SM_CXSCREEN);//Skärmstorlek x int nSizeY = GetSystemMetrics(SM_CYSCREEN);//Skärmstorlek y char szTextStamp[200]; //Text-stämpel SHORT nRad; //Radie på cirkel HDC hDC; //Device Context HDC hDC_COPY; //Kopia av DC HDC hDC_UPDATE; //Till WM_PAINT HBITMAP hBMP; //Handtag till bitmap:en PAINTSTRUCT DrwStrct; //Rit-struktur HBRUSH hBrush; //Handtag till Pensel HPEN hPen; //Handtag till Penna POINTS pStartPoint,pCurrentPoint; //Muskoordinater CHOOSECOLOR ccPalette; //Ställer in färg-dialog COLORREF crPenColor = 0xFF0000; //Färgen på pennan COLORREF crPredefinedColors[16] = //Fördef. färger i palett { 0x00000000,0x00808080,0x00800000,0x00008000, 0x00008080,0x00000080,0x00800080,0x00808000, 0x00FFFFFF,0x00C0C0C0,0x00FF0000,0x0000FF00, 0x0000FFFF,0x000000FF,0x00FF00FF,0x00FFFF00 }; CHOOSEFONT cfFontDialog; //Ställer in typsn.-dialog LOGFONT lfUserChoice; //Här hamnar valet HFONT hFont; //Handtag till typsnitt /*--------------------------FUNKTIONS-DEFINITIONER--------------------------*/ void aMENU(HWND hThis,WPARAM wThis) { switch(LOWORD(wThis)) //Val hämtas ur WPARAM-variabeln { case nNEW: aNEW(hThis); break; case nEXIT: aQUIT(hThis); break; case nPENSELECT: //Fyll i inställningar av palette-dialogen: ccPalette.lStructSize = sizeof(CHOOSECOLOR); ccPalette.hwndOwner = hThis; ccPalette.lpCustColors = &crPredefinedColors[0]; ccPalette.Flags = CC_PREVENTFULLOPEN|CC_RGBINIT; if (ChooseColor(&ccPalette)) //Om färgval... { crPenColor = ccPalette.rgbResult; //Svar hämtas hPen = CreatePen(PS_SOLID, 3, crPenColor); //Skapa penna med //denna färg } break; case nPENRED: crPenColor = RGB(255,0,0); hPen = CreatePen(PS_SOLID, 3, crPenColor); break; case nPENGREEN: crPenColor = RGB(0,255,0); hPen = CreatePen(PS_SOLID, 3, crPenColor); break; case nPENBLUE: crPenColor = RGB(0,0,255); hPen = CreatePen(PS_SOLID, 3, crPenColor); break; case nBOX: cDrawingStyle = 'B'; break; case nCIRCLE: cDrawingStyle = 'C'; break; case nFREEHAND: cDrawingStyle = 'F'; break; case nLINE: cDrawingStyle = 'L'; break; case nTEXTSTAMP: cDrawingStyle = 'T'; break; case nTEXT: dTextbox(); break; case nFONT: //Fyll i inställningar av typsnitts-dialogen: cfFontDialog.lStructSize = sizeof(CHOOSEFONT); cfFontDialog.hwndOwner = hThis; cfFontDialog.lpLogFont = &lfUserChoice; cfFontDialog.Flags = CF_SCREENFONTS; cfFontDialog.lCustData = 0L; cfFontDialog.lpfnHook = (LPCFHOOKPROC)NULL; cfFontDialog.lpTemplateName = (LPSTR)NULL; cfFontDialog.hInstance = (HINSTANCE)NULL; cfFontDialog.lpszStyle = (LPSTR)NULL; cfFontDialog.nFontType = SCREEN_FONTTYPE; if(ChooseFont(&cfFontDialog)) //Typsn.-val { hFont = CreateFontIndirect(&lfUserChoice); //Hämta val SendMessage(hThis,WM_SETFONT,(LPARAM)hFont,TRUE); //Byt typsnitt SelectObject(hDC_COPY,hFont); } break; case nHELP: MessageBox(hThis,"RTFM... ;-)","Help",MB_APPLMODAL); break; case nABOUT: MessageBox( hThis, "Smile Paint\nv.1.0\nby SmileSoft 1999", "About", MB_APPLMODAL ); break; default: MessageBox( hThis, "Error: This function is not available yet...", "Error", MB_APPLMODAL ); } } void aINIT(HWND hThis) { //När fönstret har skapats, initiera Minnes-DC:n (hDC_COPY): hDC = GetDC(hThis); //Hämta DC från fönster hDC_COPY = CreateCompatibleDC(hDC); //Skapa kopia av DC hBMP = CreateCompatibleBitmap(hDC,nSizeX,nSizeY); //Skapa bitmap från DC SelectObject(hDC_COPY,hBMP); //Koppla BMP:en -> kopia //Nollställ kopian (hDC_COPY): SelectObject(hDC_COPY, CreateSolidBrush(RGB(255,255,255))); //Koppla pensel -> kopia PatBlt(hDC_COPY,0,0,nSizeX,nSizeY,PATCOPY); //Måla över ev. skräp ReleaseDC(hThis,hDC); //Lämna DC -> fönster //Skapa penna: hPen = CreatePen(PS_SOLID, 3, crPenColor); //Initiera texten i textstämpeln strncpy(szTextStamp,"Testing",200); } void aUPDATE(HWND hThis) { //När fönster behöver updateras (WM_PAINT) återställ fönster från minnet: hDC_UPDATE = BeginPaint(hThis, &DrwStrct); BitBlt(hDC_UPDATE,0,0,nSizeX,nSizeY,hDC_COPY,0,0,SRCCOPY); EndPaint(hThis,&DrwStrct); } void aLMBD(HWND hThis,LPARAM lThis) { hDC = GetDC(hThis); //Hämta Device Context pStartPoint = MAKEPOINTS(lThis); //Kom ihåg startkoord. MoveToEx(hDC,pStartPoint.x,pStartPoint.y,NULL); //Flytta ritposition MoveToEx(hDC_COPY,pStartPoint.x,pStartPoint.y,NULL); if (cDrawingStyle!='T') //Om ej textstämpel... { SelectObject(hDC,hPen); //Välj penna -> DC SelectObject(hDC_COPY,hPen); //Välj penna -> kopia if(cDrawingStyle!='F') //Om ej frihand... SetROP2(hDC,R2_NOTXORPEN); //...NotXOR-raster } else //Om textstämpel... { SelectObject(hDC,hFont); //Välj typsnitt SelectObject(hDC_COPY,hFont); } if (cDrawingStyle=='B') //Om rektangel... { pCurrentPoint = MAKEPOINTS(lThis); //Uppdatera koord. SelectObject(hDC,GetStockObject(HOLLOW_BRUSH)); //Ihålig fyllning SelectObject(hDC_COPY,GetStockObject(HOLLOW_BRUSH)); } else if (cDrawingStyle=='C') //Om cirkel... { SelectObject(hDC,GetStockObject(HOLLOW_BRUSH)); //Ihålig fyllning } else if (cDrawingStyle=='F') //Om frihand... { LineTo(hDC,pStartPoint.x,pStartPoint.y); //Rita LineTo(hDC_COPY,pStartPoint.x,pStartPoint.y); } else if (cDrawingStyle=='T') //Om textstämpel... { TextOut(hDC,pStartPoint.x,pStartPoint.y, //Stämpla szTextStamp,strlen(szTextStamp)); TextOut(hDC_COPY,pStartPoint.x,pStartPoint.y, szTextStamp,strlen(szTextStamp)); } SetCapture(hThis); //Lås till akt. fönster bDrawing = TRUE; //Vi har börjat rita! } void aLMBU(HWND hThis,LPARAM lThis) { pCurrentPoint = MAKEPOINTS(lThis); //Uppdatera koord. if (bDrawing) //Om vi ritade... { if (cDrawingStyle=='B') //...rektanglar... { //Rita slutgiltig rektangel: SetROP2(hDC,R2_COPYPEN); Rectangle(hDC,pStartPoint.x,pStartPoint.y, pCurrentPoint.x,pCurrentPoint.y); //Kopiera slutgiltig rektangel till minnes-DC:n: SelectObject(hDC_COPY,GetStockObject(HOLLOW_BRUSH)); SetROP2(hDC_COPY,R2_COPYPEN); Rectangle(hDC_COPY,pStartPoint.x,pStartPoint.y, pCurrentPoint.x,pCurrentPoint.y); } else if (cDrawingStyle=='C') //...cirklar... { //Rita slutgiltig cirkel: SetROP2(hDC,R2_COPYPEN); Ellipse(hDC,(pStartPoint.x-nRad),(pStartPoint.y-nRad), (pStartPoint.x+nRad),(pStartPoint.y+nRad)); //Kopiera slutgiltig cirkel till minnes-DC:n: SelectObject(hDC_COPY,GetStockObject(HOLLOW_BRUSH)); SetROP2(hDC_COPY,R2_COPYPEN); Ellipse(hDC_COPY,(pStartPoint.x-nRad),(pStartPoint.y-nRad), (pStartPoint.x+nRad),(pStartPoint.y+nRad)); //Nollställ radie: nRad = 0; } else if (cDrawingStyle=='L') //...linjer... { //Rita slutgiltig linje SetROP2(hDC,R2_COPYPEN); LineTo(hDC,pStartPoint.x,pStartPoint.y); //Kopiera slutgiltig linje till minnes-DC:n: SetROP2(hDC_COPY,R2_COPYPEN); MoveToEx(hDC_COPY,pStartPoint.x,pStartPoint.y,NULL); LineTo(hDC_COPY,pCurrentPoint.x,pCurrentPoint.y); } ReleaseCapture(); //Släpp fönsterlås ReleaseDC(hThis,hDC); //Återlämna DC bDrawing = false; //Vi ritar ej! } } void aMV(LPARAM lThis) { if (bDrawing) //Om vi ritar... { if (cDrawingStyle=='B') //...rektanglar... { //Sudda ut gammal rektangel: SetROP2(hDC,R2_NOTXORPEN); Rectangle(hDC,pCurrentPoint.x,pCurrentPoint.y, pStartPoint.x,pStartPoint.y); //Rita ny rektangel pCurrentPoint = MAKEPOINTS(lThis); Rectangle(hDC,pCurrentPoint.x,pCurrentPoint.y, pStartPoint.x,pStartPoint.y); } else if (cDrawingStyle=='C') //...cirklar... { //Sudda gammal cirkel: SetROP2(hDC,R2_NOTXORPEN); Ellipse(hDC,(pStartPoint.x-nRad),(pStartPoint.y-nRad), (pStartPoint.x+nRad),(pStartPoint.y+nRad)); pCurrentPoint = MAKEPOINTS(lThis); if (abs(pCurrentPoint.x-pStartPoint.x) >abs(pCurrentPoint.y-pStartPoint.y)) { nRad = abs(pCurrentPoint.x-pStartPoint.x); } else { nRad = abs(pCurrentPoint.y-pStartPoint.y); } SetROP2(hDC,R2_NOTXORPEN); Ellipse(hDC,(pStartPoint.x-nRad),(pStartPoint.y-nRad), (pStartPoint.x+nRad),(pStartPoint.y+nRad)); SetROP2(hDC,R2_COPYPEN); } else if (cDrawingStyle=='F') //...frihand... { pCurrentPoint = MAKEPOINTS(lThis); LineTo(hDC,pCurrentPoint.x,pCurrentPoint.y); //Rita ny linje LineTo(hDC_COPY,pCurrentPoint.x,pCurrentPoint.y); //Rita ny linje } else if (cDrawingStyle=='L') //...linjer... { pCurrentPoint = MAKEPOINTS(lThis); //Sudda gammal linje: SetROP2(hDC,R2_NOTXORPEN); LineTo(hDC,pStartPoint.x,pStartPoint.y); //Rita aktuell linje: LineTo(hDC,pCurrentPoint.x,pCurrentPoint.y); SetROP2(hDC,R2_COPYPEN); } else if (cDrawingStyle=='T') //...text... { pCurrentPoint=MAKEPOINTS(lThis); TextOut(hDC,pCurrentPoint.x,pCurrentPoint.y, szTextStamp,strlen(szTextStamp)); //Stämpla ny TextOut(hDC_COPY,pCurrentPoint.x,pCurrentPoint.y, szTextStamp,strlen(szTextStamp)); //Stämpla ny } } } void aNEW(HWND hThis) { int nAnswer; nAnswer = MessageBox( hThis, "All your work will be lost forever!\nCreate new project?", "Create new project?", MB_OKCANCEL ); if (nAnswer==1) //Om användaren svarade OK... { MessageBox( //Informera om nästa steg hThis, "Next, please choose color on background...", "Choose color!", MB_OK ); //Ställ in palette-inställningar: ccPalette.lStructSize = sizeof(CHOOSECOLOR); ccPalette.hwndOwner = hThis; ccPalette.lpCustColors = &crPredefinedColors[0]; ccPalette.Flags = CC_PREVENTFULLOPEN|CC_RGBINIT; if (ChooseColor(&ccPalette)) //Låt anv. välja bg-färg { COLORREF crBGCOLOR; //Hämta färgval: crBGCOLOR = ccPalette.rgbResult; //Rensa skärm med ny färg: hDC = GetDC(hThis); hDC_COPY = CreateCompatibleDC(hDC); hBMP = CreateCompatibleBitmap(hDC,nSizeX,nSizeY); SelectObject(hDC_COPY,hBMP); SelectObject(hDC_COPY,CreateSolidBrush(crBGCOLOR)); PatBlt(hDC_COPY,0,0,nSizeX,nSizeY,PATCOPY); ReleaseDC(hThis,hDC); //Dags att rita om! (WM_PAINT skickas): InvalidateRgn(hThis,NULL,TRUE); } } } void aQUIT(HWND hThis) { int nAnswer; nAnswer = MessageBox( hThis, "All your work will be lost forever!\nQuit?", "Quit?", MB_OKCANCEL ); if (nAnswer==1) //Om OK... DestroyWindow(hThis); //...skicka WM_DESTROY }