📄 window_w32.cpp
字号:
trackbar->notify(pos);
name_len = (int)strlen(trackbar->name);
if( name_len > max_name_len )
{
int start_len = max_name_len*2/3;
int end_len = max_name_len - start_len - 2;
memcpy( pos_text, trackbar->name, start_len );
memcpy( pos_text + start_len, "...", 3 );
memcpy( pos_text + start_len + 3, trackbar->name + name_len - end_len, end_len + 1 );
}
else
{
memcpy( pos_text, trackbar->name, name_len + 1);
}
sprintf( pos_text + strlen(pos_text), "%s: %d\n", suffix, pos );
SetWindowText( trackbar->buddy, pos_text );
}
}
static LRESULT CALLBACK HGToolbarProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
CvWindow* window = icvWindowByHWND( hwnd );
if(!window)
return DefWindowProc(hwnd, uMsg, wParam, lParam);
// Control messages processing
switch(uMsg)
{
// Slider processing
case WM_HSCROLL:
{
HWND slider = (HWND)lParam;
int pos = (int)SendMessage(slider, TBM_GETPOS, 0, 0);
CvTrackbar* trackbar = icvTrackbarByHWND( slider );
if( trackbar )
{
if( trackbar->pos != pos )
icvUpdateTrackbar( trackbar, pos );
}
SetFocus( window->hwnd );
return 0;
}
case WM_NCCALCSIZE:
{
LRESULT ret = CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam);
int rows = (int)SendMessage(hwnd, TB_GETROWS, 0, 0);
if(window->toolbar.rows != rows)
{
SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
CvTrackbar* trackbar = window->toolbar.first;
for( ; trackbar != 0; trackbar = trackbar->next )
{
RECT rect;
SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
(WPARAM)trackbar->id, (LPARAM)&rect);
MoveWindow(trackbar->hwnd, rect.left + HG_BUDDY_WIDTH, rect.top,
rect.right - rect.left - HG_BUDDY_WIDTH,
rect.bottom - rect.top, FALSE);
MoveWindow(trackbar->buddy, rect.left, rect.top,
HG_BUDDY_WIDTH, rect.bottom - rect.top, FALSE);
}
window->toolbar.rows = rows;
}
return ret;
}
}
return CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam);
}
CV_IMPL void
cvDestroyAllWindows(void)
{
CvWindow* window = hg_windows;
while( window )
{
HWND mainhWnd = window->frame;
HWND hwnd = window->hwnd;
window = window->next;
SendMessage( hwnd, WM_CLOSE, 0, 0 );
SendMessage( mainhWnd, WM_CLOSE, 0, 0 );
}
}
CV_IMPL int
cvWaitKey( int delay )
{
int time0 = GetTickCount();
for(;;)
{
CvWindow* window;
MSG message;
int is_processed = 0;
if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
return -1;
if( delay <= 0 )
GetMessage(&message, 0, 0, 0);
else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
{
Sleep(1);
continue;
}
for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
{
if( window->hwnd == message.hwnd || window->frame == message.hwnd )
{
is_processed = 1;
switch(message.message)
{
case WM_DESTROY:
case WM_CHAR:
DispatchMessage(&message);
return (int)message.wParam;
case WM_KEYDOWN:
TranslateMessage(&message);
default:
DispatchMessage(&message);
is_processed = 1;
break;
}
}
}
if( !is_processed )
{
TranslateMessage(&message);
DispatchMessage(&message);
}
}
}
static CvTrackbar*
icvFindTrackbarByName( const CvWindow* window, const char* name )
{
CvTrackbar* trackbar = window->toolbar.first;
for( ; trackbar != 0 && strcmp( trackbar->name, name ) != 0; trackbar = trackbar->next )
;
return trackbar;
}
typedef struct
{
UINT cbSize;
DWORD dwMask;
int idCommand;
int iImage;
BYTE fsState;
BYTE fsStyle;
WORD cx;
DWORD lParam;
LPSTR pszText;
int cchText;
}
ButtonInfo;
CV_IMPL int
cvCreateTrackbar( const char* trackbar_name, const char* window_name,
int* val, int count, CvTrackbarCallback on_notify )
{
int result = 0;
CV_FUNCNAME( "cvCreateTrackbar" );
__BEGIN__;
char slider_name[32];
CvWindow* window = 0;
CvTrackbar* trackbar = 0;
int pos = 0;
if( !window_name || !trackbar_name )
CV_ERROR( CV_StsNullPtr, "NULL window or trackbar name" );
if( count <= 0 )
CV_ERROR( CV_StsOutOfRange, "Bad trackbar maximal value" );
window = icvFindWindowByName(window_name);
if( !window )
EXIT;
trackbar = icvFindTrackbarByName(window,trackbar_name);
if( !trackbar )
{
TBBUTTON tbs;
ButtonInfo tbis;
RECT rect;
int bcount;
int len = (int)strlen( trackbar_name );
// create toolbar if it is not created yet
if( !window->toolbar.toolbar )
{
const int default_height = 30;
window->toolbar.toolbar = CreateToolbarEx(
window->frame, WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE,
1, 0, 0, 0, 0, 0, 16, 20, 16, 16, sizeof(TBBUTTON));
GetClientRect(window->frame, &rect);
MoveWindow( window->toolbar.toolbar, 0, 0,
rect.right - rect.left, default_height, TRUE);
SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0);
ShowWindow(window->toolbar.toolbar, SW_SHOW);
window->toolbar.first = 0;
window->toolbar.pos = 0;
window->toolbar.rows = 0;
window->toolbar.toolBarProc =
(WNDPROC)icvGetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC);
icvUpdateWindowPos(window);
// Subclassing from toolbar
icvSetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC, HGToolbarProc);
icvSetWindowLongPtr(window->toolbar.toolbar, CV_USERDATA, window);
}
/* Retrieve current buttons count */
bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
if(bcount > 1)
{
/* If this is not the first button then we need to
separate it from the previous one */
tbs.iBitmap = 0;
tbs.idCommand = bcount; // Set button id to it's number
tbs.iString = 0;
tbs.fsStyle = TBSTYLE_SEP;
tbs.fsState = TBSTATE_ENABLED;
SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs);
// Retrieve current buttons count
bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
}
/* Add a button which we're going to cover with the slider */
tbs.iBitmap = 0;
tbs.idCommand = bcount; // Set button id to it's number
tbs.fsState = TBSTATE_ENABLED;
#if 0/*!defined WIN64 && !defined EM64T*/
tbs.fsStyle = 0;
tbs.iString = 0;
#else
#ifndef TBSTYLE_AUTOSIZE
#define TBSTYLE_AUTOSIZE 0x0010
#define TBSTYLE_GROUP 0x0004
#endif
//tbs.fsStyle = TBSTYLE_AUTOSIZE;
tbs.fsStyle = TBSTYLE_GROUP;
tbs.iString = (INT_PTR)trackbar_text;
#endif
SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs);
/* Adjust button size to the slider */
tbis.cbSize = sizeof(tbis);
tbis.dwMask = TBIF_SIZE;
GetClientRect(window->hwnd, &rect);
tbis.cx = (unsigned short)(rect.right - rect.left);
SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO,
(WPARAM)tbs.idCommand, (LPARAM)&tbis);
/* Get button position */
SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
(WPARAM)tbs.idCommand, (LPARAM)&rect);
/* Create a slider */
trackbar = (CvTrackbar*)cvAlloc( sizeof(CvTrackbar) + len + 1 );
trackbar->signature = CV_TRACKBAR_MAGIC_VAL;
trackbar->notify = 0;
trackbar->parent = window;
trackbar->pos = 0;
trackbar->data = 0;
trackbar->id = bcount;
trackbar->next = window->toolbar.first;
trackbar->name = (char*)(trackbar + 1);
memcpy( trackbar->name, trackbar_name, len + 1 );
window->toolbar.first = trackbar;
sprintf(slider_name, "Trackbar%p", val);
trackbar->hwnd = CreateWindowEx(0, TRACKBAR_CLASS, slider_name,
WS_CHILD | WS_VISIBLE | TBS_AUTOTICKS |
TBS_FIXEDLENGTH | TBS_HORZ | TBS_BOTTOM,
rect.left + HG_BUDDY_WIDTH, rect.top,
rect.right - rect.left - HG_BUDDY_WIDTH,
rect.bottom - rect.top, window->toolbar.toolbar,
(HMENU)(size_t)bcount, hg_hinstance, 0);
sprintf(slider_name,"Buddy%p", val);
trackbar->buddy = CreateWindowEx(0, "STATIC", slider_name,
WS_CHILD | SS_RIGHT,
rect.left, rect.top,
HG_BUDDY_WIDTH, rect.bottom - rect.top,
window->toolbar.toolbar, 0, hg_hinstance, 0);
icvSetWindowLongPtr( trackbar->hwnd, CV_USERDATA, trackbar );
/* Minimize the number of rows */
SendMessage( window->toolbar.toolbar, TB_SETROWS,
MAKEWPARAM(1, FALSE), (LPARAM)&rect );
}
else
{
trackbar->data = 0;
trackbar->notify = 0;
}
trackbar->maxval = count;
/* Adjust slider parameters */
SendMessage(trackbar->hwnd, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, count));
SendMessage(trackbar->hwnd, TBM_SETTICFREQ, (WPARAM)1, (LPARAM)0 );
if( val )
pos = *val;
SendMessage(trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos );
SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0);
trackbar->pos = -1;
icvUpdateTrackbar( trackbar, pos );
ShowWindow( trackbar->buddy, SW_SHOW );
ShowWindow( trackbar->hwnd, SW_SHOW );
trackbar->notify = on_notify;
trackbar->data = val;
/* Resize the window to reflect the toolbar resizing*/
icvUpdateWindowPos(window);
result = 1;
__END__;
return result;
}
CV_IMPL void
cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param )
{
CV_FUNCNAME( "cvSetMouseCallback" );
__BEGIN__;
CvWindow* window = 0;
if( !window_name )
CV_ERROR( CV_StsNullPtr, "NULL window name" );
window = icvFindWindowByName(window_name);
if( !window )
EXIT;
window->on_mouse = on_mouse;
window->on_mouse_param = param;
__END__;
}
CV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name )
{
int pos = -1;
CV_FUNCNAME( "cvGetTrackbarPos" );
__BEGIN__;
CvWindow* window;
CvTrackbar* trackbar = 0;
if( trackbar_name == 0 || window_name == 0 )
CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
window = icvFindWindowByName( window_name );
if( window )
trackbar = icvFindTrackbarByName( window, trackbar_name );
if( trackbar )
pos = trackbar->pos;
__END__;
return pos;
}
CV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos )
{
CV_FUNCNAME( "cvSetTrackbarPos" );
__BEGIN__;
CvWindow* window;
CvTrackbar* trackbar = 0;
if( trackbar_name == 0 || window_name == 0 )
CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
window = icvFindWindowByName( window_name );
if( window )
trackbar = icvFindTrackbarByName( window, trackbar_name );
if( trackbar )
{
if( pos < 0 )
pos = 0;
if( pos > trackbar->maxval )
pos = trackbar->maxval;
SendMessage( trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos );
icvUpdateTrackbar( trackbar, pos );
}
__END__;
}
CV_IMPL void* cvGetWindowHandle( const char* window_name )
{
void* hwnd = 0;
CV_FUNCNAME( "cvGetWindowHandle" );
__BEGIN__;
CvWindow* window;
if( window_name == 0 )
CV_ERROR( CV_StsNullPtr, "NULL window name" );
window = icvFindWindowByName( window_name );
if( window )
hwnd = (void*)window->hwnd;
__END__;
return hwnd;
}
CV_IMPL const char* cvGetWindowName( void* window_handle )
{
const char* window_name = "";
CV_FUNCNAME( "cvGetWindowName" );
__BEGIN__;
CvWindow* window;
if( window_handle == 0 )
CV_ERROR( CV_StsNullPtr, "NULL window" );
window = icvWindowByHWND( (HWND)window_handle );
if( window )
window_name = window->name;
__END__;
return window_name;
}
CV_IMPL void
cvSetPreprocessFuncWin32(int (__cdecl *on_preprocess)(HWND, UINT, WPARAM, LPARAM, int*))
{
if(on_preprocess)
hg_on_preprocess = on_preprocess;
else
assert(on_preprocess);
}
CV_IMPL void
cvSetPostprocessFuncWin32(int (__cdecl *on_postprocess)(HWND, UINT, WPARAM, LPARAM, int*))
{
if(on_postprocess)
hg_on_postprocess = on_postprocess;
else
assert(on_postprocess);
}
#endif //WIN32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -