But watch out ye who don't like me
125 sec for TinyScheme
Many thanks, Mike.
... I think the most natural way to interface these Lispish languages is through text i/o, redirected from console to specified APIs ...
@Mike & @Petr - "Romania is just third in the world after the US and UK on the standard of living for IT people."
Is that spilling over into your lives?
However many thousands of them preferred to move directly to Silicon Valley during the past decade escaping the oppressive economic realities of Europe's last dictatorial regime.
POP
Pop off one value from the GOSUB/RETURN stack. After this command a RETURN will return to one level higher and to the place where it was called from. For more information see the documentation of the command GOSUB and RETURN.
It is just one sample among a ton of amazing submissions written by Patrice Terrier ...
I've never had any doubt you had to pay cash to have it designed for you.
... can you make translucent console windows with OpenGl?
P.S. And by the way, can you provide any feedback on the subject matter of my graphical "console" proposition? Even if MS Windows is not your preferred environment.
I have found that it is possible to run Opengl in at least 2 child windows. The trick is to use a single rendering context (hRC) and then for each child window, select the device context (wglMakeCurrent hDC, hRC ), render it, and SwapBuffers. This may not work for all video cards, but certainly for NVidia.
this is entirely GDI+ stuffthen ok !
for the subject matter was your remarkable article on CodeProject dot com dated January 2, 2014The article was bookmarked only 19 times...
The article was bookmarked only 19 times...
Meaning that very few undesrtood it
void RenderWindow(IN HWND hWnd, IN LONG_PTR hImg) {
if (hImg) {
BLENDFUNCTION bf = {0};
RECT rw; GetWindowRect(hWnd, &rw);
SIZEL lpSize; lpSize.cx = rw.right - rw.left; lpSize.cy = rw.bottom - rw.top;
POINT lp; lp.x = rw.left; lp.y = rw.top;
POINT ptSrc = {0};
HDC hParentDC = GetDC(GetParent(hWnd));
HDC hMemDC = CreateCompatibleDC(hParentDC);
HBITMAP hBmp = CreateCompatibleBitmap(hParentDC, lpSize.cx, lpSize.cy);
if (hMemDC) {
SelectObject(hMemDC, hBmp);
LONG_PTR graphics = 0;
if (GdipCreateFromHDC(hMemDC, graphics) == 0) {
GdipDrawImageRectRectI(graphics, hImg, 0, 0, lpSize.cx, lpSize.cy, 0, 0, lpSize.cx, lpSize.cy, 2, 0, NULL, NULL);
GdipDeleteGraphics(graphics);
}
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.AlphaFormat = AC_SRC_ALPHA; // Use source alpha
bf.SourceConstantAlpha = 255; //alpha
UpdateLayeredWindow (hWnd, hParentDC, &lp, &lpSize, hMemDC, &ptSrc, 0, &bf, ULW_ALPHA);
DeleteObject(hBmp);
DeleteDC(hMemDC);
}
ReleaseDC(GetParent(hWnd), hParentDC);
}
}
Your ghost-dragging solution is ingenious. Your work on this problem is intensive! :)Thanks go to the late Steve Jobbs. :)
I'm toying with very simple whole-window transparency. The sweet spot seems to be an alpha value of around 240 (/255), so the background is slightly visible, but not intrusive.My proto uses an alpha value of 250. Then the general outline of another layered window underlying the blurred "console" can yet be recognized while setting full opacity would still make the "console" pass for a completely non-transparent window, especially if it is heavily colored. BTW, Patrice's original SkinBox sources didn't know this alpha tweak and, when blurred, made the underlying layered window completely invisible. Probably this was the very reason why only one SkinBox process could be launched at any one time by Patrice's design. :D
SetLayeredWindowAttributes(hwnd, 0, WindowOpacity, LWA_ALPHA)If you aren't planning to change the attributes often, then perhaps Patrice's
But Snapshot (Ctrl P) captures the client area before composite transparency is applied. ie: from the frame buffer with glReadPixels.I can't comment on this in any way because I don't know the inner workings of Oxygen's Snapshot feature yet. :)
My "mother tongue" is FBSL whose JIT compiler accepts classic ANSI C. That's why I don't publish the quick prototype's alien code here, but rather a precompiled executable only, until it's well polished and is ready to be ported to native OxygenBasic.
everything including OpenGL is ultimatly drawn on the DirectDraw surface with a fixed refresch rate of 60Hz.
Luckily, I'm not using OpenGL for this project but rather GDI+
switch (nCtrlType) {
case CTRL_LISTBOX:
case CTRL_COMBOLISTBOX:
if (ListCount(hWnd) > 0) { // To deal with the DWM_AERO mode
if ((nCtrlType = CTRL_LISTBOX) && (skGetSystemMetrics(SK_DWM_AERO))) {
skChildOffset(hWnd, ofX, ofY);
if (wParam == 0) {
BeginPaint(hWnd, &ps); hDC = ps.hdc;
} else {
hDC = (HDC) wParam;
}
hDCmem = skOFFscreen(hDC, Xin, Yin, 1);
CallWindowProc(ChildMessage, WM_PRINTCLIENT, (WPARAM) hDCmem, lParam);
if (GdipCreateFromHDC(hDCmem, graphics) == 0) {
GdipCreateBitmapFromHBITMAP((HBITMAP) GetCurrentObject(hDCmem, OBJ_BITMAP), NULL, img);
GdipDrawImageRectI(graphics, img, 0, 0, Xin, Yin);
if (img) { GdipDisposeImage(img); }
GdipDeleteGraphics(graphics);
}
skOFFscreen(0, 0, 0, 0);
if (wParam == 0) { EndPaint(hWnd, &ps); }
return 0;
} else {
nRet = CallWindowProc(ChildMessage, uMsg, wParam, lParam);
}
} else { // in case of empty ListBox
skChildOffset(hWnd, ofX, ofY);
if (wParam == 0) {
BeginPaint(hWnd, &ps); hDC = ps.hdc; }
else {
hDC = (HDC) wParam;
}
hDCmem = skOFFscreen(hDC, Xin, Yin, 1);
if (nCtrlType == CTRL_LISTBOX) {
skAlphaBlend(hDCmem, 0, 0, Xin, Yin, skGetHdcMemBmp(skPopupOwner(hWnd)), ofX, ofY, Xin, Yin);
skShadowBlt(hDCmem, 0, 0, Xin, Yin, skGetSysColor(SKCOLOR_SHADOW), skGetSystemMetrics(SK_TRANSLUCENCY));
} else { // 4.61 CTRL_COMBOLISTBOX
skFillRect(hDCmem, 0, 0, Xin, Yin, skGetSysColor(SKCOLOR_EDITCOLORBACK));
}
skOFFscreen(0, 0, 0, 0);
if (wParam == 0) { EndPaint(hWnd, &ps); }
return 0;
}
break;
LRESULT CALLBACK ScrollBarProc(IN HWND hWnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) {
LRESULT nRet = 0;
RECT rc = {0}, rw = {0};
PAINTSTRUCT ps = {0}; POINT p = {0}; SCROLLBARINFO sbi = {0}; SCROLLINFO si = {0};
HDC hDC = 0, hDCpaint = 0; HRGN hRgn = 0, hRgnClip = 0;
HWND hMain = 0, hParent = 0;
long x = 0, y = 0, w = 0, h = 0, xX = 0, yY = 0, UseSB = 0, nState = 0, ofX = 0, ofY = 0, hH = 0;
long UseState = 0, dxy = 0, dxy1 = 0, dxy2 = 0, nDelta = 0, K = 0, nCtrlType = 0;
static long TimerDelay, ThumbMoving, ThumbX, ThumbY;
long nItem = GetScrollParent(hWnd, hParent);
if (nItem > -1) {
switch (uMsg) {
case WM_TIMER:
if (IsLButtonDown()) {
GetWindowRect(hWnd, &rw);
GetCursorPos(&p);
x = p.x - rw.left; y = p.y - rw.top;
if (SBmouseCheck(hWnd, hParent, UseSB, x, y, nItem, ThumbMoving)) { return nRet; }
}
else {
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
ReleaseCapture();
}
break;
case WM_MOUSEMOVE:
if (ThumbMoving) {
nCtrlType = g_Child[skChild(hParent)].CtrlType;
GetCursorPos(&p);
sbi.cbSize = sizeof(sbi);
if (ThumbMoving == THUMB_HORZ) {
if (nCtrlType == CTRL_ZIMAGECTRL) {
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(hParent, SB_HORZ, &si);
GetScrollBarInfo(hParent, OBJID_HSCROLL, &sbi);
dxy1 = sbi.rcScrollBar.left + sbi.dxyLineButton;
dxy2 = sbi.rcScrollBar.right - sbi.dxyLineButton;
p.x -= (sbi.xyThumbBottom - sbi.xyThumbTop) / 2;
nDelta = dxy2 - dxy1; if (nDelta == 0) { nDelta = 1; } // 10-31-2013 Avoid divide by zero
//dxy = (min(max(p.x, dxy1), dxy2) - dxy1);
//dxy = (long) (dxy * ((si.nMax - si.nMin) / (float) nDelta));
dxy = (long) ((min(max(p.x, dxy1), dxy2) - dxy1) * ((si.nMax - si.nMin) / (float) nDelta));
if (dxy != si.nPos) {
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
si.nPos = dxy;
SetScrollInfo(hParent, SB_HORZ, &si, TRUE);
skRedrawWindow(hParent);
} }
else {
nDelta = (p.x - ThumbX); ThumbX = p.x;
if (nDelta > 0) { // To the right
UseSB = SB_LINERIGHT; }
else { // To the left
UseSB = SB_LINELEFT;
}
for (K = 0; K < abs(nDelta); ++K) {
if (IsLButtonDown() == 0) {
ThumbMoving = 0;
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
ReleaseCapture();
break;
}
SendMessage(hParent, WM_HSCROLL, MAKLNG(UseSB, 0), 0);
}
} }
else {
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(hParent, SB_VERT, &si);
GetScrollBarInfo(hParent, OBJID_VSCROLL, &sbi);
dxy1 = sbi.rcScrollBar.top + sbi.dxyLineButton;
dxy2 = sbi.rcScrollBar.bottom - sbi.dxyLineButton;
if (nCtrlType == CTRL_ZIMAGECTRL) {
p.y -= (sbi.xyThumbBottom - sbi.xyThumbTop) / 2;
}
nDelta = dxy2 - dxy1; if (nDelta == 0) { nDelta = 1; } // 10-31-2013 Avoid divide by zero
//dxy = (min(max(p.y, dxy1), dxy2) - dxy1);
//dxy = (long) (dxy * ((si.nMax - si.nMin) / (float) nDelta));
dxy = (long) ((min(max(p.y, dxy1), dxy2) - dxy1) * ((si.nMax - si.nMin) / (float) nDelta));
if (dxy != si.nPos) {
InvalidateRect(hParent, NULL, 0);
switch (nCtrlType) {
case CTRL_LISTVIEW:
SendMessage(hParent, LVM_ENSUREVISIBLE, dxy, 0);
break;
case CTRL_LISTBOX:
SendMessage(hParent, LB_SETTOPINDEX, dxy, 0);
break;
case CTRL_SYSTREEVIEW:
SendMessage(hParent, WM_VSCROLL, MAKLNG(SB_THUMBTRACK, dxy), 0);
break;
case CTRL_EDIT:
SendMessage(hParent, WM_VSCROLL, MAKLNG(SB_THUMBTRACK, dxy), 0);
break;
case CTRL_ZIMAGECTRL:
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
si.nPos = dxy;
SetScrollInfo(hParent, SB_VERT, &si, TRUE);
skRedrawWindow(hParent);
break;
}
}
}
}
break;
case WM_LBUTTONDOWN:
x = LOINT(lParam); y = HIINT(lParam);
if (SBmouseCheck(hWnd, hParent, UseSB, x, y, nItem, ThumbMoving)) { return nRet; }
ReleaseCapture();
SetCapture(hWnd);
if (GetFocus() != hParent) { SetFocus(hParent); }
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
if (ThumbMoving == 0) {
TimerDelay = 50; SetTimer(hWnd, 1, TimerDelay, NULL); }
else {
GetCursorPos(&p);
ThumbX = p.x; ThumbY = p.y;
}
return nRet;
case WM_LBUTTONUP:
ThumbMoving = 0;
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
ReleaseCapture();
skUpdateWindow(hWnd, 0);
break;
case WM_SIZE:
GetWindowRect(hParent, &rw);
p.x = 0; p.y = 0; ClientToScreen(GetParent(hParent), &p);
x = rw.left - p.x; y = rw.top - p.y;
w = rw.right - rw.left; h = rw.bottom - rw.top;
MoveWindow(hWnd, x, y, w, h, 0);
GetClientRect(hParent, &rc);
if (g_Child[skChild(hParent)].CtrlType == CTRL_COMBOLISTBOX) { nDelta = 1; } else { nDelta = 0; }
hRgnClip = CreateRectRgn(0, 0, w, h + nDelta);
hRgn = CreateRectRgn(rc.left + nDelta, rc.top + nDelta, rc.right + nDelta, rc.bottom + nDelta);
CombineRgn(hRgnClip, hRgnClip, hRgn, RGN_DIFF);
SetWindowRgn(hWnd, hRgnClip, 0);
SetWindowRgn(hParent, hRgn, 0);
if (nItem > -1) {
UseSB = skCheckScrollBar(hParent);
sbi.cbSize = sizeof(sbi);
p.x = 0; p.y = 0; ClientToScreen(hWnd, &p);
if ((UseSB == SCROLLBAR_VERT) || (UseSB == SCROLLBAR_BOTH)) {
GetScrollBarInfo(hParent, OBJID_VSCROLL, &sbi);
x = sbi.rcScrollBar.left - p.x;
y = sbi.rcScrollBar.top - p.y;
w = sbi.rcScrollBar.right - p.x - x;
h = sbi.rcScrollBar.bottom - p.y - y;
SetRect(&g_SI[nItem].rvu, x, y, x + sbi.dxyLineButton, y + sbi.dxyLineButton); // Vertical Up button
SetRect(&g_SI[nItem].rvt, x, y + sbi.xyThumbTop, x + sbi.dxyLineButton, y + sbi.xyThumbBottom); // Vertical Thumb button
SetRect(&g_SI[nItem].rvd, x, y + h - sbi.dxyLineButton, x + sbi.dxyLineButton, y + h); // Vertical Down button
}
if ((UseSB == SCROLLBAR_HORZ) || (UseSB == SCROLLBAR_BOTH)) {
GetScrollBarInfo(hParent, OBJID_HSCROLL, &sbi);
x = sbi.rcScrollBar.left - p.x;
y = sbi.rcScrollBar.top - p.y;
w = sbi.rcScrollBar.right - p.x - x;
h = sbi.rcScrollBar.bottom - p.y - y;
SetRect(&g_SI[nItem].rhl, x, y, x + sbi.dxyLineButton, y + sbi.dxyLineButton); // Vertical Up button
SetRect(&g_SI[nItem].rht, x + sbi.xyThumbTop, y, x + sbi.xyThumbBottom, y + sbi.dxyLineButton); // Vertical Thumb button
SetRect(&g_SI[nItem].rhr, x + w - sbi.dxyLineButton, y, x + w, y + sbi.dxyLineButton); // Vertical Down button
}
}
return nRet;
case WM_PRINT:
case WM_PAINT:
case WM_ERASEBKGND:
if (uMsg == WM_PAINT) {
hDCpaint = BeginPaint(hWnd, &ps); }
else { // WM_PRINT
hDCpaint = (HDC) wParam;
}
hDC = hDCpaint;
UseSB = skCheckScrollBar(hParent);
// GOSUB DetectState
if (IsLButtonDown()) {
GetWindowRect(hWnd, &rw);
GetCursorPos(&p);
p.x -= rw.left; p.y -= rw.top;
GetClientRect(hWnd, &rc);
if ((UseSB == SCROLLBAR_BOTH) && (p.x > rc.right - GetSystemMetrics(SM_CXVSCROLL) - 1) && (y > rc.bottom - GetSystemMetrics(SM_CYHSCROLL) - 1)) {
p.x = 0; p.y = 0; } // Do nothing
else {
if (p.x < rc.right - GetSystemMetrics(SM_CXVSCROLL)) {
// HORIZONTAL SCROLLBAR
if (PtInRect(&g_SI[nItem].rhl, p)) { // Button Left
nState = 4; }
else if (PtInRect(&g_SI[nItem].rht, p)) { // Button Thumb
nState = 5; }
else if (PtInRect(&g_SI[nItem].rhr, p)) { // Button Right
nState = 6; }
else { // Page
nState = 8; }
}
else {
// VERTICAL SCROLLBAR
if (PtInRect(&g_SI[nItem].rvu, p)) { // Button Up
nState = 1; }
else if (PtInRect(&g_SI[nItem].rvt, p)) { // Button Thumb
nState = 2; }
else if (PtInRect(&g_SI[nItem].rvd, p)) { // Button Down
nState = 3; }
else { // Page
nState = 7;
}
}
}
}
hMain = skPopupOwner(hWnd);
sbi.cbSize = sizeof(sbi);
p.x = 0; p.y = 0; ClientToScreen(hWnd, &p);
if ((UseSB == SCROLLBAR_VERT) || (UseSB == SCROLLBAR_BOTH)) {
GetScrollBarInfo(hParent, OBJID_VSCROLL, &sbi);
x = sbi.rcScrollBar.left - p.x;
y = sbi.rcScrollBar.top - p.y;
w = sbi.rcScrollBar.right - p.x - x;
h = sbi.rcScrollBar.bottom - p.y - y;
if (UseSB == SCROLLBAR_BOTH) { GetClientRect(hWnd, &rc); hH = rc.bottom - h; }
if (uMsg == WM_PAINT) {
hDC = skOFFscreen(hDCpaint, w, h + hH, 1);
xX = x; yY = y; }
else {
xX = 0; yY = 0;
}
GetWindowRect(hMain, &rw);
ofX = sbi.rcScrollBar.left - rw.left; ofY = sbi.rcScrollBar.top - rw.top;
if (g_Child[skChild(hParent)].CtrlType == CTRL_COMBOLISTBOX) {
nDelta = 1;
w = w - nDelta;
// Draw shadow border.
skDrawRect3D(hDC, 0, 0, x + w + 2, h + 2, skGetSysColor(SKCOLOR_EDITCOLORRECTUP), skGetSysColor(SKCOLOR_EDITCOLORRECTDOWN)); }
else {
nDelta = 0;
}
skAlphaBlend(hDC, x - xX, y - yY, w, h, skGetHdcMemBmp(hMain), ofX, ofY, w, h);
skPaintButton(hDC, 3, g_VertBar, x - xX, y - yY, w, h);
SetRect(&g_SI[nItem].rvt, x, y + sbi.xyThumbTop, x + sbi.dxyLineButton, y + sbi.xyThumbBottom); // Vertical Thumb button
if (nState == 1) {
UseState = 2; }
else {
UseState = 1;
}
skPaintButton(hDC, UseState, g_VertBar, g_SI[nItem].rvu.left - xX, g_SI[nItem].rvu.top - yY, g_SI[nItem].rvu.right - g_SI[nItem].rvu.left, g_SI[nItem].rvu.bottom - g_SI[nItem].rvu.top);
DrawPicto(hDC, 1, g_SI[nItem].rvu.left - xX, g_SI[nItem].rvu.top - yY, g_SI[nItem].rvu.right - g_SI[nItem].rvu.left, g_SI[nItem].rvu.bottom - g_SI[nItem].rvu.top);
if (nState = 2) {
UseState = 5; }
else {
UseState = 1;
}
skPaintButton(hDC, UseState, g_VertBar, g_SI[nItem].rvt.left - xX, g_SI[nItem].rvt.top - yY, g_SI[nItem].rvt.right - g_SI[nItem].rvt.left, g_SI[nItem].rvt.bottom - g_SI[nItem].rvt.top);
DrawPicto(hDC, 2, g_SI[nItem].rvt.left - xX, g_SI[nItem].rvt.top - yY, g_SI[nItem].rvt.right - g_SI[nItem].rvt.left, g_SI[nItem].rvt.bottom - g_SI[nItem].rvt.top);
if (nState = 3) {
UseState = 2; }
else {
UseState = 1;
}
skPaintButton(hDC, UseState, g_VertBar, g_SI[nItem].rvd.left - xX, g_SI[nItem].rvd.top - yY, g_SI[nItem].rvd.right - g_SI[nItem].rvd.left, g_SI[nItem].rvd.bottom - g_SI[nItem].rvd.top);
DrawPicto(hDC, 3, g_SI[nItem].rvd.left - xX, g_SI[nItem].rvd.top - yY, g_SI[nItem].rvd.right - g_SI[nItem].rvd.left, g_SI[nItem].rvd.bottom - g_SI[nItem].rvd.top);
if (UseSB == SCROLLBAR_BOTH) { // Paint the right corner
skAlphaBlend(hDC, x - xX, y - yY + h, w, hH, skGetHdcMemBmp(hMain), ofX, ofY + h, w, hH);
skPaintButton(hDC, 3, g_VertBar, x - xX, y - yY + h, w, hH);
}
if (uMsg == WM_PAINT) { skOFFscreen(0, x, y, 0); }
}
if ((UseSB == SCROLLBAR_HORZ) || (UseSB == SCROLLBAR_BOTH)) {
GetScrollBarInfo(hParent, OBJID_HSCROLL, &sbi);
x = sbi.rcScrollBar.left - p.x;
y = sbi.rcScrollBar.top - p.y;
w = sbi.rcScrollBar.right - p.x - x;
h = sbi.rcScrollBar.bottom - p.y - y;
if (uMsg == WM_PAINT) {
hDC = skOFFscreen(hDCpaint, w, h, 1);
xX = x; yY = y; }
else {
xX = 0; yY = 0;
}
GetWindowRect(hMain, &rw);
ofX = sbi.rcScrollBar.left - rw.left; ofY = sbi.rcScrollBar.top - rw.top;
skAlphaBlend(hDC, x - xX, y - yY, w, h, skGetHdcMemBmp(hMain), ofX, ofY, w, h);
skPaintButton(hDC, 3, g_HorzBar, x - xX, y - yY, w, h);
SetRect(&g_SI[nItem].rht, x + sbi.xyThumbTop, y, x + sbi.xyThumbBottom, y + sbi.dxyLineButton); // Vertical Thumb button
if (nState == 4) { UseState = 2; } else { UseState = 1; }
skPaintButton(hDC, UseState, g_HorzBar, g_SI[nItem].rhl.left - xX, g_SI[nItem].rhl.top - yY, g_SI[nItem].rhl.right - g_SI[nItem].rhl.left, g_SI[nItem].rhl.bottom - g_SI[nItem].rhl.top);
DrawPicto(hDC, 4, g_SI[nItem].rhl.left - xX, g_SI[nItem].rhl.top - yY, g_SI[nItem].rhl.right - g_SI[nItem].rhl.left, g_SI[nItem].rhl.bottom - g_SI[nItem].rhl.top);
if (nState == 5) { UseState = 5; } else { UseState = 1; }
skPaintButton(hDC, UseState, g_HorzBar, g_SI[nItem].rht.left - xX, g_SI[nItem].rht.top - yY, g_SI[nItem].rht.right - g_SI[nItem].rht.left, g_SI[nItem].rht.bottom - g_SI[nItem].rht.top);
DrawPicto(hDC, 5, g_SI[nItem].rht.left - xX, g_SI[nItem].rht.top - yY, g_SI[nItem].rht.right - g_SI[nItem].rht.left, g_SI[nItem].rht.bottom - g_SI[nItem].rht.top);
if (nState == 6) { UseState = 2; } else { UseState = 1; }
skPaintButton(hDC, UseState, g_HorzBar, g_SI[nItem].rhr.left - xX, g_SI[nItem].rhr.top - yY, g_SI[nItem].rhr.right - g_SI[nItem].rhr.left, g_SI[nItem].rhr.bottom - g_SI[nItem].rhr.top);
DrawPicto(hDC, 6, g_SI[nItem].rhr.left - xX, g_SI[nItem].rhr.top - yY, g_SI[nItem].rhr.right - g_SI[nItem].rhr.left, g_SI[nItem].rhr.bottom - g_SI[nItem].rhr.top);
if (uMsg == WM_PAINT) { skOFFscreen(0, x, y, 0); }
}
if (uMsg == WM_PAINT) {
EndPaint(hWnd, &ps);
}
if (uMsg == WM_ERASEBKGND) {
nRet = 1; }
else {
nRet = 0;
}
return nRet;
case WM_DESTROY:
if (TimerDelay) { KillTimer(hWnd, 1); TimerDelay = 0; }
break;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Tooks me years to figure how to handle them correctlyI realize and appreciate that to the fullest.
I can use a similar vertical trackbar to scroll the text area.Absolutly ! that's the easiest way.