📄 winutil.c
字号:
#include "winutil.h"
#include <time.h>
#include <string.h>
#include <stdio.h>
void ShowLastError(char *prefix)
{
char string[1024];
int plen;
DWORD err;
err = GetLastError();
sprintf(string,"%s : %d = %08X : \0",prefix,err,err);
plen = strlen(string);
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM , NULL, err, 0, string+plen, sizeof(string)-plen, NULL);
MessageBox(NULL,string,"win32 error", MB_OK|MB_SETFOREGROUND );
}
HBRUSH createBrush(int style,ulong color)
{
if ( style == HS_SOLID ) {
return CreateSolidBrush(color);
} else {
return CreateHatchBrush(style,color);
}
}
void frameRect(HDC hdc,RECT *rect,HPEN pen)
{
HGDIOBJ obj;
obj = SelectObject(hdc,pen);
moveTo(hdc,rect->left ,rect->top);
lineTo(hdc,rect->right,rect->top);
lineTo(hdc,rect->right,rect->bottom);
lineTo(hdc,rect->left ,rect->bottom);
lineTo(hdc,rect->left ,rect->top);
SelectObject(hdc,obj);
}
void drawLineClipped(HDC hdc,int fmx,int fmy,int tox,int toy,RECT *r)
{
if ( ( tox <= r->left && fmx <= r->left ) ||
( tox >= r->right && fmx >= r->right ) ||
( toy <= r->top && fmy <= r->top ) ||
( toy >= r->bottom && fmy >= r->bottom ) ) return;
fmx = max(fmx,r->left);
tox = max(tox,r->left);
fmx = min(fmx,r->right);
tox = min(tox,r->right);
fmy = max(fmy,r->top);
toy = max(toy,r->top);
fmy = min(fmy,r->bottom);
toy = min(toy,r->bottom);
drawLine(hdc,fmx,fmy,tox,toy);
}
void changeDlgInt(HWND dlg,int control,int val,bool sign)
{
int old;
BOOL ok;
old = GetDlgItemInt(dlg,control,&ok,sign);
if ( !ok || old != val )
SetDlgItemInt(dlg,control,val,sign);
}
void SetTextBkColor(HDC hdc,ulong fore,ulong back)
{
SetTextColor(hdc,fore);
SetBkColor(hdc,back);
}
void dialogScrollRange(HWND dlg,int control,int range)
{
SCROLLINFO sri;
HWND wnd = GetDlgItem(dlg,control);
sri.cbSize = sizeof(SCROLLINFO);
sri.fMask = SIF_RANGE;
sri.nMin = 0;
sri.nMax = range;
SetScrollInfo( wnd, SB_CTL, &sri, FALSE);
sri.fMask = SIF_PAGE;
sri.nPage = 1;
SetScrollInfo( wnd, SB_CTL, &sri, FALSE);
}
void dialogScrollSetPos(HWND dlg,int control,int pos)
{
SCROLLINFO sri;
HWND wnd = GetDlgItem(dlg,control);
sri.cbSize = sizeof(SCROLLINFO);
sri.fMask = SIF_POS;
sri.nPos = pos;
SetScrollInfo( wnd, SB_CTL, &sri, TRUE);
}
int dialogScrollGetPos(HWND dlg,int control)
{
return GetScrollPos( GetDlgItem(dlg,control), SB_CTL);
}
void dialogListClear(HWND dlg,int control)
{
SendDlgItemMessage( dlg, control, LB_RESETCONTENT,0, 0 );
}
void dialogListAdd(HWND dlg,int control,char *str)
{
SendDlgItemMessage( dlg, control, LB_ADDSTRING, 0, (DWORD)(LPSTR) str );
}
int dialogListGetSel(HWND dlg,int control)
{
return SendDlgItemMessage( dlg, control, LB_GETCURSEL, 0, 0);
}
void dialogListSetSel(HWND dlg,int control,int sel)
{
SendDlgItemMessage( dlg, control, LB_SETCURSEL, sel, 0);
}
bool intersectRect(RECT *a,RECT *b)
{
RECT t;
return IntersectRect(&t,a,b);
}
void cutTailSpaces(char *str)
{
char *estr;
estr = str + strlen(str);
while(estr >= str)
{
switch(*estr)
{
case 0:
case ' ':
case '\t':
case '\r':
case '\n':
*estr-- = 0;
break;
default:
return;
}
}
}
void niceCapitals(char *str)
{
while(*str) {
if ( isalpha(*str) ) {
*str++ = toupper(*str);
while ( isalpha(*str) ) {
*str++ = tolower(*str);
}
} else {
str++;
}
}
}
/**** tsc waiter ; better than micro-second accuracy *****/
#define TSC_PER_SEC ( ((ulong)200000000) >> 8 )
ulong tsc(void)
{
ulong hi,lo;
/** <> no tsc on 6x86 !! **/
#define tscasm __asm _emit 0x0F __asm _emit 0x31
__asm {
tscasm
mov hi,edx
mov lo,eax
}
lo >>= 8;
lo += (hi&0xFF) << 24;
return(lo);
}
void await(int millisecs)
{
ulong start;
ulong waitfor;
#if 1
start = (ulong) clock();
waitfor = (CLOCKS_PER_SEC*millisecs/1000);
while ( ((ulong)clock() - start) < waitfor );
#else
start = (ulong) tsc();
waitfor = (TSC_PER_SEC*millisecs/1000);
while ( ((ulong)tsc() - start) < waitfor );
#endif
}
HPEN grayPen,ltgrayPen,dkgrayPen;
void winUtilDispose()
{
DeleteObject(grayPen);
DeleteObject(ltgrayPen);
DeleteObject(dkgrayPen);
}
void winUtilInit()
{
/* <> GetSysColor(COLOR_ACTIVEBORDER); */
grayPen = CreatePen(PS_SOLID,0,0xA0A0A0);
ltgrayPen = CreatePen(PS_SOLID,0,0xE0E0E0);
dkgrayPen = CreatePen(PS_SOLID,0,0x707070);
}
void bevelRectI(HDC hdc,RECT * r)
{
SelectObject( hdc, dkgrayPen );
MoveToEx(hdc,r->right,r->top,NULL);
LineTo(hdc,r->left,r->top);
LineTo(hdc,r->left,r->bottom);
SelectObject( hdc, ltgrayPen );
LineTo(hdc,r->right,r->bottom);
LineTo(hdc,r->right,r->top);
}
void bevelRect(HDC hdc,RECT * r)
{
SelectObject( hdc, ltgrayPen );
MoveToEx(hdc,r->right,r->top,NULL);
LineTo(hdc,r->left,r->top);
LineTo(hdc,r->left,r->bottom);
SelectObject( hdc, dkgrayPen );
LineTo(hdc,r->right,r->bottom);
LineTo(hdc,r->right,r->top);
}
void bevelLineX(HDC hdc,int fmx,int tox,int y)
{
SelectObject( hdc, ltgrayPen );
moveTo(hdc,fmx,y+1);
LineTo(hdc,tox,y+1);
SelectObject( hdc, grayPen );
moveTo(hdc,fmx,y);
LineTo(hdc,tox,y);
SelectObject( hdc, dkgrayPen );
moveTo(hdc,fmx,y-1);
LineTo(hdc,tox,y-1);
}
void fancyBevelRect(HDC hdc,RECT * r)
{
bevelRect(hdc,r);
r->top +=2; r->bottom -=2;
r->left +=2; r->right -=2;
bevelRectI(hdc,r);
r->top -=2; r->bottom +=2;
r->left -=2; r->right +=2;
}
void fancyBevelRectOut(HDC hdc,RECT * r)
{
r->top -=2; r->bottom +=2;
r->left -=2; r->right +=2;
bevelRect(hdc,r);
r->top +=2; r->bottom -=2;
r->left +=2; r->right -=2;
bevelRectI(hdc,r);
}
void fancyBevelRectI(HDC hdc,RECT * r)
{
bevelRectI(hdc,r);
r->top +=2; r->bottom -=2;
r->left +=2; r->right -=2;
bevelRect(hdc,r);
r->top -=2; r->bottom +=2;
r->left -=2; r->right +=2;
}
void fancyBevelRectIOut(HDC hdc,RECT * r)
{
r->top -=2; r->bottom +=2;
r->left -=2; r->right +=2;
bevelRectI(hdc,r);
r->top +=2; r->bottom -=2;
r->left +=2; r->right -=2;
bevelRect(hdc,r);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -