Drehknopf darstellen



  • Hallo, ich bin noch WinAPI-Anfänger und suche eine Möglichkeit einen Drehknopf wie bei einem Oszilloskop zu erstellen. Gibt es da in der Winapi was Fertiges? Nett wäre auch wenn ich da mit eigener Grafik arbeiten könnte, aber für den Anfang reicht auch was Vorgegebenes.





  • Gut, das ist die Referenz zu GDI+ und damit kann ich selbst zeichnen, aber das hilft mir leider nur sehr bedingt bei der Erstellung eines eigenen Controls in Form eines Drehknopfes.

    Wie realisiere ich dass das Control Nachrichten sendet wenn ich es anklicke und beispielsweise die Maus mit gedrückter Taste nach oben und unten oder recht und links bewege?

    Das Control muss dann doch ein eigenes Childwindow sein oder? Ich habe da überhaupt keinen Plan wie ich das angehen soll

    Also ein Fenster mit ein paar Standardcontrols und der Warteschlange bekomme ich hin, aber halt keine sogenannten Customcontrols.



  • Hallo,

    Zu der Maus sagt MSDN:
    "The WM_LBUTTONDOWN message is posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse."

    Ich würde mir ein Ownerdrawn Static Control basteln,...

    in der Art:

    _hStaticControl=CreateWindowExA(WS_EX_TRANSPARENT, (LPCSTR)"STATIC", 
    			(LPCSTR)this->_wcsWindow._strText_SGN_Off.c_str(), 
    				WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 
    				rct.left,rct.top, rct.right, rct.bottom, hWnd, 0, 0, 0);
    

    Das Parent Window behandelt dann das Zeichnen dieser Static.

    LRESULT CALLBACK _sgnWindow::_window::MainProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    	{
    
    switch(msg)
    	{
    
    		case WM_CLOSE:
    			{/*...*/ break;}
    
    		case WM_LBUTTONDOWN:
    			{ 
    				/*... speichere jetzige postion, oder berechne vektorielle differenz zu vorherigen postion...*/ 
    				return 1;}
        case WM_PAINT: InvalidateRect(hWnd,NULL,FALSE); break;
    		case WM_DRAWITEM:
    		{
    
    				LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
            if(pDIS==NULL) { return 0;};
    
    //Achtung ist ein unvollständiger Code ausschnitt von mir,...
    //Im endeffekt zeichnest du hier Dein Kreis, und den strich für die Markierung  des Drehknopfes hier...
    				if (pDIS->hwndItem == _hStaticControl)
    				{
    
    					//Get Sgn vars
    					COLORREF back,front;
    					string text;
    
    				//Select Color to draw the background, store old object
    				HGDIOBJ _wOldObj=SelectObject(pDIS->hDC,CreateSolidBrush(back));
    				RECT rctClient={0};
    				GetClientRect(_wcs->_hStaticControl,&rctClient);
    				Rectangle(pDIS->hDC,0,0,rctClient.right,rctClient.bottom);
    
    				//Set BackgroundColor
    				SetBkColor(pDIS->hDC,back);
    				SetTextColor(pDIS->hDC,front);
    
    				//Now Select the font if not 
    				//Get Textmetrix for Printout
    				TEXTMETRIC tm;
    				GetTextMetrics(pDIS->hDC, &tm); 
    				int y = (rctClient.bottom + rctClient.top - tm.tmHeight)/2; 
    				int x = LOWORD(GetDialogBaseUnits()) / 4; 
    
    				//Now print the Text
    				ExtTextOut(pDIS->hDC, x, y, 
                    ETO_CLIPPED | ETO_OPAQUE, &rctClient,
    				text.c_str(), text.length(), NULL); 
    
                    //Select Pen for drawing the frame
            HGDIOBJ _oldPen=SelectObject(pDIS->hDC,CreatePen(PS_SOLID,2,RGB(0x7b,0x9e,0xbd)));
            MoveToEx(pDIS->hDC,0,0,NULL);
            LineTo(pDIS->hDC,rctClient.right,0);
            LineTo(pDIS->hDC,rctClient.right,rctClient.bottom);
            LineTo(pDIS->hDC,0,rctClient.bottom);
            LineTo(pDIS->hDC,0,0);
            //        Rectangle(pDIS->hDC,1,1,rctClient.right,rctClient.bottom);
    
    					//WCHAR staticText[99];
    					//int len = SendMessage(myStatic, WM_GETTEXT, ARRAYSIZE(staticText), (LPARAM)staticText);
    //					TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, staticText, len);
            }
    
    				return TRUE;
    		}
    
    		default: break;
    	}
    
    	return DefWindowProc(hWnd,msg,wParam,lParam);
    	};
    

    Sag bescheid wenn was ist 😉

    grüüße



  • Vielen vielen lieben Dank, ich werde das demnächst ausprobieren.


Log in to reply