Default Blue Green Red
Pagina's: [1]
  Print  
Auteur Topic: [Tutorial]Colour Picker  (gelezen 329 keer)
rodojo
Newbie
*
Berichten: 30


« Gepost op: Juni 12, 2010, 01:11:54 »

Hier mijn eerste tutorial. Misschien dat ie daarom nog een beetje slecht is.
Voor deze tutorial moet je al wel een beetje kennis hebben hoe een API scherm in elkaar zit qua code.
Waarschijnlijk heb je er niets aan, maar je C++ kennis wordt wel vergroot :p

Ik gebruik Code::Blocks, je kunt in principe ook wel andere compilers gebruiken, maar misschien heten de dingen daar anders.

Als je Code::Blocks(gratis) wilt downloaden, kan dat hier: http://www.codeblocks.org/downloads.

Wat is een colour-picker/color-picker nou precies? Simpel, die vraagt de RGB waarden op van een pixel op en daarmee kun je weten komen wat voor een kleur de pixel heeft. Waarom dan hierover een tutorial? Omdat er veel mensen zijn die het moeilijk vinden en het is erg/redelijk moeilijk om iets te vinden op internet.
Maar wat heb je eraan? Tja, dat kun je jezelf afvragen. Je kunt dit gebruiken om een soort van auto-aimer voor Call Of Duty(Ik weer met m'n Call Of Duty :p) en andere
spellen te maken.


We starten een 'WIN32 GUI project' op. De standaard bestanden worden automatisch aangemaakt.


We gaan nu echt een start maken: plaats pal onder de geïnclude bestanden (#include <windows.h> etc.) '#define ID_OUTPUTTEXT 1'.
Vervolgens heb je, niet ver daar onderaan een regel:
Code
GeSHi (cpp):
int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {
 
Created by GeSHI 1.0.7.20
.
We zetten onder die regel:
Code
GeSHi (cpp):
static HWND hwndOutputtext;
static HWND hwndOutputtext1;
static HWND hwndOutputtext2;
static HWND hwndOutputtext3;
Created by GeSHI 1.0.7.20

Dit is van belang voor bij het aanmaken
van de tekstvelden. Maar hoe maken we de tekstvelden? Dat komt nu...

Boven de regels
Code
GeSHi (cpp):
while (GetMessage (&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
Created by GeSHI 1.0.7.20
gaan we
Code
GeSHi (cpp):
int stap=0;
Created by GeSHI 1.0.7.20
plaatsen.

In de while zelf voegen we dit toe(DUS ER ACHTERAAN PLAKKEN!):
Code
GeSHi (cpp):
if (stap==0) {
  hwndOutputtext  = CreateWindow(TEXT("STATIC"), "Om buiten dit schermpje ook nog RGB-codes te kunnen pikken moet je [ENTER] indrukken en inhouden.", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 0, 544, 30, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext1 = CreateWindow(TEXT("STATIC"), "TEST1", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 30, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext2 = CreateWindow(TEXT("STATIC"), "TEST2", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 45, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext3 = CreateWindow(TEXT("STATIC"), "TEST3", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 60, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  stap=1;
}
Created by GeSHI 1.0.7.20
Voor diegenen die dit niet snappen: hier worden er 4 tekstvelden aangemaakt. In de bovenste tekstveld wordt er uitleg gegeven, en in de rest komen de waarden van de
kleuren te staan.


Goed, alles mooi en aardig, maar als ik het run, dan krijg ik alleen wat tekst en meer niet. Daar hebben we niets aan, dus gaan we 'het systeem' erin bouwen.
Plaats onder/boven de 'int stap=0;' die je eerder hebt geplaatst
Code
GeSHi (cpp):
COLORREF pixel;
BYTE redValue, greenValue, blueValue;
 
Created by GeSHI 1.0.7.20
Dit is van essentieel belang.


Vervolgens plaatsen we onder de codes
'if (stap==0) {
...
}
'
Code
GeSHi (cpp):
 
char buffer1[100],buffer2[100],buffer3[100];
 
HDC hdc_   = GetWindowDC(NULL);
pixel      = GetPixel(hdc_, x, y);
redValue   = GetRValue(pixel);  
greenValue = GetGValue(pixel);  
blueValue  = GetBValue(pixel);
 
sprintf ( buffer1, "Rood: %u", redValue);
sprintf ( buffer2, "Groen: %u", greenValue);
sprintf ( buffer3, "Blauw: %u", blueValue);
 
SetWindowText(hwndOutputtext1,buffer1);
SetWindowText(hwndOutputtext2,buffer2);
SetWindowText(hwndOutputtext3,buffer3);
 
Created by GeSHI 1.0.7.20
Wat doet dit ongeveer? Dit haalt een code op. Deze code wordt gesplitst(in rood, groen en blauw) door een aantal codes. Verder zorgt het ervoor dat ie de tekst steeds veranderd van de tekstvelden 2 tm/ 4. Hij laat de waarden dus zien.


Als je het nu runt, zal het nog steeds fout zijn. Waardoor komt dat? Hij weet bij de GetPixel(); de waarden van variabele x en de waarden van variabele y niet. Je kunt
in principe hier zelf wat in vullen, en dan doet ie het wel. Maar je moet dan steeds weer in je codes aanpassen welke pixel je wil picken. Dus we maken dat je de pixel
pickt waar je op dat moment op je muis mee zit.
Plaats dus boven de code die we net hadden behandeld, en onder de codes tussen de 'if (stap==0) {...}'
Code
GeSHi (cpp):
POINT pos;  
GetCursorPos(&pos);
int x=pos.x;
int y=pos.y;
 
Created by GeSHI 1.0.7.20
Dit haalt de coördinaten van je muis op. Als het goed is doet ie het nu en heb je de volgende code:
Code
GeSHi (cpp):
#include <windows.h>
#include <iostream>
#include <string>
 
 
#define ID_OUTPUTTEXT 1
 
using namespace std;
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {
using namespace std;
   HWND hwnd;
   MSG messages;
   WNDCLASSEX wincl;
 
   static HWND hwndOutputtext;
   static HWND hwndOutputtext1;
   static HWND hwndOutputtext2;
   static HWND hwndOutputtext3;
 
 
   wincl.hInstance = hThisInstance;
   wincl.lpszClassName = szClassName;
   wincl.lpfnWndProc = WindowProcedure;      
   wincl.style = CS_DBLCLKS;                
   wincl.cbSize = sizeof (WNDCLASSEX);
 
 
   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
   wincl.lpszMenuName = NULL;                
   wincl.cbClsExtra = 0;                      
   wincl.cbWndExtra = 0;                    
 
   wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
   if (!RegisterClassEx (&wincl))return 0;
 
   hwnd = CreateWindowEx (0, szClassName, "Krijg de RGB-code van een kleur!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
 
   ShowWindow (hwnd, nFunsterStil);
 
   int stap=0;
   HWND RuneScape;
   COLORREF pixel;
   BYTE redValue, greenValue, blueValue;  
 
 
 
while (GetMessage (&messages, NULL, 0, 0)){
TranslateMessage(&messages);
DispatchMessage(&messages);
if (stap==0) {
  hwndOutputtext  = CreateWindow(TEXT("STATIC"), "Om buiten dit schermpje ook nog RGB-codes te kunnen pikken moet je [ENTER] indrukken en inhouden.", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 0, 544, 30, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext1 = CreateWindow(TEXT("STATIC"), "TEST1", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 30, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext2 = CreateWindow(TEXT("STATIC"), "TEST2", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 45, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  hwndOutputtext3 = CreateWindow(TEXT("STATIC"), "TEST3", WS_CHILD | WS_VISIBLE | SS_LEFT, 00, 60, 544, 15, hwnd, (HMENU) ID_OUTPUTTEXT, NULL, NULL);
  stap=1;
}
 
   POINT pos;  
   GetCursorPos(&pos);
   int x=pos.x;
   int y=pos.y;
 
   char buffer1[100],buffer2[100],buffer3[100];
 
   HDC hdc_   = GetWindowDC(NULL);
   pixel      = GetPixel(hdc_, x, y);
   redValue   = GetRValue(pixel);  
   greenValue = GetGValue(pixel);  
   blueValue  = GetBValue(pixel);
 
   sprintf ( buffer1, "Rood: %u", redValue);
   sprintf ( buffer2, "Groen: %u", greenValue);
   sprintf ( buffer3, "Blauw: %u", blueValue);
 
 
   SetWindowText(hwndOutputtext1,buffer1);
   SetWindowText(hwndOutputtext2,buffer2);
   SetWindowText(hwndOutputtext3,buffer3);
   }
 
 
   return messages.wParam;
}
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;
switch (message) {
case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    EndPaint(hwnd, &ps);
break;
       case WM_DESTROY:
           PostQuitMessage (0);      
           break;
       default:                    
           return DefWindowProc (hwnd, message, wParam, lParam);
   }
 
   return 0;
}
 
Created by GeSHI 1.0.7.20


Over een week ofzo komt misschien nog een stuk erbij, die d.m.v. hooking er voor zorgt  dat je geen [ENTER] meer hoeft in te drukken wil je de RGB-code buiten je
schermpje te weten komen.
« Laatste verandering: Augustus 01, 2010, 12:25:46 door rodojo » Gelogd
Divendo
Global Moderator
Hero Member
*****
Berichten: 646


Voer in op google maps: 37.971458,23.726706


WWW E-mail
« Antwoord #1 Gepost op: Juni 12, 2010, 02:21:44 »

Ik heb hem niet helemaal uitgebreid gelezen, maar het ziet er goed uit wink
En de code werkt smile
Tenminste op 1 klein dingetje na... Je moet gdi32.lib aan je project linken.
Hoe dat moet verschilt per editor.

Verder kleine tip, je kan je C++ code in C++ opmaak posten, kijk zo:
Code
GeSHi (cpp):
#include <iostream>
int main()
{
 std::cout<<"Hello world!";
 return 0;
}
Created by GeSHI 1.0.7.20
Dat kan simpelweg door [ code=cpp ]Je code[ /code ] te typen ipv [ code ]Je code[ /code ] (uiteraard zonder de spaties wink)
Dit werkt ook voor PHP, JavaScript en nog veel meer... Zie daar voor het menuutje met de tekst "GeSHi", daar kun je de opmaak van je code selecteren smile
Gelogd

Globale moderator

Citaat van: Bjarne Stroustrup
C makes it easy to shoot yourself in the foot...
C++ makes it harder, but when you do so it'll blow your whole leg off!
rodojo
Newbie
*
Berichten: 30


« Antwoord #2 Gepost op: Juni 12, 2010, 03:10:55 »

Bedankt voor je rating en bedankt voor je tip  smile
« Laatste verandering: Juni 12, 2010, 03:16:12 door rodojo » Gelogd
Pagina's: [1]
  Print  
 
Ga naar: