|
Can anyone help with a nice algorithm to create a gradient style color ramp?
What I need is to specific the first and last colors and generate a specified number of colors between them.
Best regards,
Paul.
Paul Selormey, Bsc (Elect Eng), MSc (Mobile Communication) is currently Windows open source developer in Japan, and open for programming contract anywhere!
|
|
|
|
|
This is what I use :
COLORREF *Gradient(COLORREF start, COLORREF end, int steps)
{
if (steps < 2)
return NULL;
COLORREF *output = new COLORREF[steps];
output[0] = start;
output[steps - 1] = end;
double sR = (double)GetRValue(start);
double sB = (double)GetBValue(start);
double sG = (double)GetGValue(start);
double eR = (double)GetRValue(end);
double eB = (double)GetBValue(end);
double eG = (double)GetGValue(end);
double RedStep = (eR - sR) / (double)steps;
double BlueStep = (eB - sB) / (double)steps;
double GreenStep = (eG - sG) / (double)steps;
for (int x = 1; x < steps - 1; x++)
{
sR += RedStep;
sB += BlueStep;
sG += GreenStep;
output[x] = RGB((BYTE)sR, (BYTE)sB, (BYTE)sG);
}
return output;
}
---
It may be that your sole purpose in life is simply to serve as a warning to others.
|
|
|
|
|
(I previewed this before posting it, but I don't know why the blank lines are missing from the pre section.)
void RampColours(int nColourCount, COLORREF crLowColour, COLORREF crHighColour, COLORREF* pColourTable)
{
double red_step, green_step, blue_step;
int red_low, green_low, blue_low;
red_low = GetRValue(crLowColour);
green_low = GetGValue(crLowColour);
blue_low = GetBValue(crLowColour);
red_step = (double)(GetRValue(crHighColour) - red_low) / (double)nColourCount;
green_step = (double)(GetGValue(crHighColour) - green_low) / (double)nColourCount;
blue_step = (double)(GetBValue(crHighColour) - blue_low) / (double)nColourCount;
pColourTable[0] = crLowColour;
pColourTable[nColourCount] = crHighColour;
for (int i = 0; i <= nColourCount; i++) {
pColourTable[i] = RGB( red_low + (red_step * (double)i), green_low + (green_step * (double)i), blue_low + (blue_step * (double)i) );
}
}
"Am I talking too fast, or are you just playing dumb? If you want I can write it down." -Jarvis Cocker/Pulp
|
|
|
|
|
Here is another one. This is from a little app I hope to be posting here soon :
<br />
BYTE InterpColor( BYTE top, BYTE bottom, int linendx, int maxlines )<br />
{<br />
if( top == bottom )<br />
return top;<br />
<br />
double cval = (double)linendx * (double)( bottom - top ) / (double)maxlines;<br />
cval += (double)top;<br />
return (BYTE)cval;<br />
}<br />
<br />
<br />
void GetGradientColor( int count, int index, COLORREF top, COLORREF bottom )<br />
{<br />
BYTE r = InterpColor( GetRValue( top ), GetRValue( bottom ), index, count );<br />
BYTE g = InterpColor( GetGValue( top ), GetGValue( bottom ), index, count );<br />
BYTE b = InterpColor( GetBValue( top ), GetBValue( bottom ), index, count );<br />
COLORREF color = RGB( r, g, b );<br />
return color;<br />
}<br />
<br />
This is not the absolutely most efficient algorithm but it works well for me. There are some easy optimizations that could be made but I have never seen the speed of this to be a problem.
|
|
|
|
|
Rick York wrote:
void GetGradientColor( int count, int index, COLORREF top, COLORREF bottom )
That's nice, but what about some dithering? Does anyone know how to implement one (at least of 'ordered' style)?
* Origin: Silence Must Be Heard (2:5030/844.235)
|
|
|
|
|
Hello All,
Thanks so much for coming quickly to my aid. May God bless you all.
Best regards,
Paul.
Paul Selormey, Bsc (Elect Eng), MSc (Mobile Communication) is currently Windows open source developer in Japan, and open for programming contract anywhere!
|
|
|
|
|
Hi, i have a problem, there are a lot of interesting activex controls - but they are loaded dynamicaly (or not?) so i'm not sure if all the users will have them - can you help me - are there some ActiveX controls that are installed on every win machine ? For example there is "Microsoft Forms Checkbox" (or socalled) is it available on every win-box ?
thanks a lot for explanation
john
|
|
|
|
|
- Can you help?
- Regards,
BigMouth
|
|
|
|
|
|
- Thanks, Mike pal!
- I do not know what you mean? Do you mean "http://comp.os.linux.*" ? How to check? I am a newbie. Can you help?
- Have a nice day,
Maer
|
|
|
|
|
It means newsgroups with names starting with "comp.os.linux". Newsgroups aren't WWW pages, so there's no "http://". Use your newsreader program (Outlook Express, Forte Agent, etc. under Windows) and subscribe to groups in the comp.os.linux hierarchy. If your ISP doesn't support newsgroups, you can use Google Groups (http://groups.google.com).
|
|
|
|
|
- Thanks pal!
- I have known what you mean. I think there are a lot of news groups that conform to your conditon. (starting with "comp.os.linux")
- Can you introduce some of them that is best for newbies?
- Regards,
BigMouth
|
|
|
|
|
I have found the registry entries for the timezone list and the current Timezone setting. I am assuming (maybe incorrectly) that MS use these two areas to setup the timezone selection combo box in the timedate.cpl aplet. The problem is that you can't rely on the bias entry because more than one entry may be present with the same bias. The strings are different in both areas (as in AUS Eastern Std Time) so how do they select the correct one??
Happy programming!!
|
|
|
|
|
I don't quite understand what you are trying to do, but perhaps you should be calling the GetTimeZoneInformation function?
"Am I talking too fast, or are you just playing dumb? If you want I can write it down." -Jarvis Cocker/Pulp
|
|
|
|
|
I am writing an application where the user should be able to specify a timezone other than the one they are in. I therefore want add a combobox for them to select from - like the timedate applet. (this will not change computer settings) During initialization I want to select the computers present timezone in the combobox, because this is the one used by default.
I however cannot find information from GetTimeZoneInformation that matches well enough to make this selection.
Happy programming!!
|
|
|
|
|
Please help!
|
|
|
|
|
|
Yeah it's ok the simplest way is to use _mk_dir ...... but i didnt know it was now in direct.h and not dir.h!
|
|
|
|
|
If you want to link with the C run-time library it is. Some people have an aversion to this.
By the way, check out the source code for mkdir. It just calls CreateDirectory with a NULL security attributes structure. However, mkdir is the more portable of the two.
|
|
|
|
|
How can i wait an event only for 5 sec?
I have DCB,
HANDLE port;
DWORD dwEvtMask;
CreateFile(port,...);
and after i have
fSuccess = SetCommMask(port, EV_CTS|EV_DSR);
event.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL);
if (WaitCommEvent(port, &dwEvtMask, &event))
{
if (dwEvtMask & EV_DSR)
{
//Something to do
}
}
So, i need to wait only for 5 sec, if i couldn't receive something to commport, how can i stop it? And how can i wait 5 sec?
|
|
|
|
|
I need to send keystrokes to another running process. I already have the hwnd to the process to which I want to send the keystrokes. I'm using this to send the keystrokes. It doesn't work:
::SendMessage(m_fwhs.hWndFound, WM_KEYDOWN, nChar, MAKELPARAM(MAKEWORD(0,(byte)nChar), 0));
::SendMessage(m_fwhs.hWndFound, WM_KEYUP, nChar, MAKELPARAM(MAKEWORD(1,(byte)nChar), MAKEWORD(0,8)));
Can anyone provide any clues?
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
My first guess is that SendMessage() is the problem. Normally a message loop converts WM_KEYDOWN/WM_KEYUP pairs into WM_CHAR or WM_SYSCHAR (that's what TranslateMessage() does). When you SendMessage() a WM_KEYDOWN, your app blocks until the message is processed by the target app. Since the WM_KEYUP isn't in its queue, the result is foobared.
Try changing it to PostMessage().
</wildguess>
--Mike--
http://home.inreach.com/mdunn/
"Not our fault we are intellectually superior to the rest of the office." -- Paul Watson in the Lounge, 12/12/2001
Sonork - 100.10414 AcidHelm
|
|
|
|
|
I had this problem before, and I found some code here http://wwwthep.physik.uni-mainz.de/~frink/nt.html that helped. Scroll to the middle of the page and look for "pushkeys for C".
Hope this helps.
"Am I talking too fast, or are you just playing dumb? If you want I can write it down." -Jarvis Cocker/Pulp
|
|
|
|
|
Recently I ummm ... figured out ... how Microsoft did SendKeys and it is just a bunch of keybd_event calls. So IMHO, just go with the link Daniel listed. It has some examples.
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|
|
Well yes but with keybd_event you have to rely on the app having focus - the classic vb example calls AppActivate before SendKeys - might be nicer without that.
|
|
|
|