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:
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:
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
GeSHi (cpp):
while (GetMessage (&messages, NULL, 0, 0)) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}Created by GeSHI 1.0.7.20
gaan we
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!):
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
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) {
...
}
'
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) {...}'
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:
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.