📄 wdefbase.c
字号:
}
BOOL WdeBaseGetFirstChild ( WdeBaseObject *obj, OBJPTR *first, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
if ( ( obj->num_children == 0 ) || ( obj->children == NULL ) ) {
*first = NULL;
} else {
*first = ListElement ( obj->children );
}
return ( TRUE );
}
BOOL WdeBaseDraw( WdeBaseObject *obj, RECT *area, HDC *dc )
{
POINT origin;
RECT client_rect;
RECT intersect;
LIST *olist;
OBJPTR child;
OBJPTR tops;
RECT child_rect;
Bool show_child;
/* touch unused vars to get rid of warning */
_wde_touch(dc);
GetOffset( &origin );
GetClientRect( obj->res_info->edit_win, &client_rect );
OffsetRect( &client_rect, origin.x, origin.y );
child = NULL;
/* we must process the children in reverse order */
if( obj->children ) {
WdeListLastElt( obj->children, &olist );
} else {
olist = NULL;
}
tops = NULL;
for( olist = obj->children; olist; olist = ListNext( olist ) ) {
child = ListElement( olist );
Location( child, &child_rect );
show_child = IntersectRect( &intersect, &child_rect, &client_rect );
Forward( child, SHOW_WIN, &show_child, NULL );
if( !show_child ) {
child = NULL;
} else {
if( !Forward( child, DRAW, area, NULL ) ) {
WdeWriteTrail("WdeBaseDraw: child draw failed!");
}
if( !tops ) {
tops = child;
}
}
}
if( IntersectRect( &intersect, area, &client_rect ) ) {
OffsetRect( &intersect, -origin.x, -origin.y );
RedrawWindow( obj->res_info->edit_win, &intersect, (HRGN) NULL,
RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_NOERASE | RDW_UPDATENOW );
if( child && !Forward ( tops, ON_TOP, NULL, NULL) ) {
WdeWriteTrail("WdeBaseDraw: child ON_TOP failed!");
return( FALSE );
}
}
return( TRUE );
}
BOOL WdeBaseGetResizeInfo ( WdeBaseObject *obj, RESIZE_ID *info, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(obj);
_wde_touch(p2);
*info = R_NONE;
return ( TRUE );
}
BOOL WdeBaseIdentify ( WdeBaseObject *obj, OBJ_ID *id, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
*id = obj->object_id;
return ( TRUE );
}
BOOL WdeBaseValidateAction ( WdeBaseObject *obj, ACTION *act, void *p2 )
{
int i;
/* touch unused vars to get rid of warning */
_wde_touch(p2);
if ( *act == MOVE ) {
return ( FALSE );
}
for ( i = 0; i < MAX_ACTIONS; i++ ) {
if( WdeBaseActions[i].id == *act ) {
return ( TRUE );
}
}
return ( ValidateAction( (OBJPTR) obj->o_item, *act, p2 ) );
}
BOOL WdeBaseGetWindowHandle ( WdeBaseObject *obj, HWND *hwin, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
*hwin = obj->res_info->edit_win;
return ( TRUE );
}
BOOL WdeBaseAddSubObject ( WdeBaseObject *base_obj, OBJPTR obj, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
/* make sure objects are inserted at the end of list */
WdeInsertObject ( &(base_obj->children), obj );
WdeAddOrderedEntry ( &(base_obj->ochildren), obj );
base_obj->num_children++;
Notify ( obj, NEW_PARENT , base_obj->object_handle );
WdeCheckBaseScrollbars( FALSE );
return ( TRUE );
}
Bool WdeBaseFindSubObjects ( WdeBaseObject *obj, SUBOBJ_REQUEST *req,
LIST **obj_list )
{
return ( WdeFindSubObjects ( req, obj_list, obj->children ) );
}
BOOL WdeBaseFindObjectsPt ( WdeBaseObject *obj, POINT *pt, LIST **obj_list )
{
LIST *subobjs;
OBJPTR child;
OBJ_ID id;
if ( WdeFindObjectsAtPt ( pt, &subobjs, obj->children ) ) {
child = ListElement ( subobjs );
if ( !( Forward ( child, IDENTIFY, &id, NULL ) &&
( id == DIALOG_OBJ ) ) ||
!Forward ( child, FIND_OBJECTS_PT, pt, obj_list ) ) {
ListAddElt ( obj_list, child );
}
ListFree ( subobjs );
} else {
ListAddElt ( obj_list, obj );
}
return ( TRUE );
}
BOOL WdeBaseRemoveSubObject ( WdeBaseObject *base_obj, OBJPTR obj, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
if ( base_obj->num_children && ListFindElt (base_obj->children, obj) ) {
ListRemoveElt ( &(base_obj->children), obj);
WdeRemoveOrderedEntry ( base_obj->ochildren, obj);
base_obj->num_children--;
if( !base_obj->num_children ) {
base_obj->children = NULL;
base_obj->res_info->next_current = NULL;
}
} else {
return ( FALSE );
}
return ( TRUE );
}
BOOL WdeBasePutChildFirst ( WdeBaseObject *obj, OBJPTR child, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
if ( obj->num_children ) {
if ( !WdePutObjFirst ( child, &(obj->children) ) ) {
WdeWriteTrail("WdeBasePutChildFirst: WdePutObjFirst failed!");
return ( FALSE );
}
} else {
WdeWriteTrail("WdeBasePutChildFirst: No children!");
return ( FALSE );
}
return ( TRUE );
}
BOOL WdeBaseNotify ( WdeBaseObject *base_obj, NOTE_ID *id, void *p2 )
{
OBJPTR obj;
WdeInfoStruct is;
/* touch unused vars to get rid of warning */
_wde_touch(p2);
switch ( *id ) {
case PRIMARY_OBJECT:
obj = base_obj->res_info->next_current;
if ( obj && ( obj != base_obj ) ) {
MakeObjectCurrent( obj );
} else if ( base_obj->num_children ) {
obj = ListElement ( base_obj->children );
MakeObjectCurrent( obj );
} else {
WdeSetBaseObject ( IDM_SELECT_MODE );
WdeSetBaseObjectMenu(base_obj->res_info->hash_table != NULL);
memset ( &is, 0, sizeof(WdeInfoStruct) );
is.obj_id = BASE_OBJ;
is.obj = base_obj->object_handle;
is.res_info = base_obj->res_info;
WdeWriteInfo ( &is );
}
return ( TRUE );
}
return ( Notify ( (OBJPTR) base_obj->o_item, *id, p2 ) );
}
BOOL WdeBaseLocation( WdeBaseObject *base_obj, RECT *obj_rect, void *p2 )
{
RECT onion;
RECT rect1;
RECT rect2;
/* touch unused vars to get rid of warning */
_wde_touch(base_obj);
_wde_touch(p2);
if( base_obj->res_info->edit_win != NULL ) {
GetClientRect( base_obj->res_info->edit_win, &rect1 );
if( IsRectEmpty( &rect1 ) ) {
rect1.right++;
rect1.bottom++;
}
} else {
SetRectEmpty( &rect1 );
}
WdeGetBoundingRectFromList( base_obj->children, &rect2 );
InflateRect( &rect2, WDE_WORLD_PAD, WDE_WORLD_PAD );
UnionRect( &onion, &rect1, &rect2 );
*obj_rect = onion;
return( TRUE );
}
BOOL WdeBaseGetSubObjectList ( WdeBaseObject *base_obj, LIST **l, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
*l = base_obj->children;
return( TRUE );
}
static void isWorldInBaseClient( WdeBaseObject *base_obj,
BOOL *x_in, BOOL *y_in )
{
RECT client_rect;
RECT bounding_rect;
*x_in = FALSE;
*y_in = FALSE;
if( base_obj->res_info->edit_win == NULL ) {
return;
}
if( base_obj->children == NULL ) {
return;
}
GetClientRect( base_obj->res_info->forms_win, &client_rect );
WdeGetBoundingRectFromList( base_obj->children, &bounding_rect );
InflateRect( &bounding_rect, WDE_WORLD_PAD, WDE_WORLD_PAD );
if( ( bounding_rect.left < client_rect.left ) ||
( bounding_rect.right > client_rect.right ) ) {
*x_in = TRUE;
}
if( ( bounding_rect.top < client_rect.top ) ||
( bounding_rect.bottom > client_rect.bottom ) ) {
*y_in = TRUE;
}
return;
}
static BOOL enableFormsScrollbars( WdeBaseObject *base_obj,
BOOL enablex, BOOL enabley )
{
STATE_HDL state_handle;
SCR_CONFIG scroll_config;
state_handle = GetCurrFormID();
if( state_handle == (STATE_HDL)NULL ) {
return( FALSE );
}
scroll_config = SCROLL_NONE;
if( enablex ) {
scroll_config |= SCROLL_HORZ;
}
if( enabley ) {
scroll_config |= SCROLL_VERT;
}
SetFormEditWnd( state_handle, base_obj->res_info->forms_win,
MENU_NONE, scroll_config );
return( TRUE );
}
BOOL WdeCheckBaseScrollbars( BOOL in_resize )
{
WdeBaseObject *base_obj;
BOOL enablex;
BOOL enabley;
RECT rect;
if( WdeInCleanup() ) {
return( TRUE );
}
base_obj = (WdeBaseObject *)GetMainObject();
if( !base_obj || !base_obj->res_info ) {
return( FALSE );
}
if( base_obj->in_destroy ) {
return( TRUE );
}
enablex = FALSE;
enabley = FALSE;
isWorldInBaseClient( base_obj, &enablex, &enabley );
if( ( enablex == base_obj->has_hscroll ) &&
( enabley == base_obj->has_vscroll ) ) {
return( TRUE );
}
if( enablex != base_obj->has_hscroll ) {
if( !enablex ) {
SetScrollPos( base_obj->res_info->forms_win, SB_HORZ, 0, FALSE );
}
SetScrollRange( base_obj->res_info->forms_win, SB_HORZ, 0, (enablex) ?100 :0, FALSE );
ShowScrollBar( base_obj->res_info->forms_win, SB_HORZ, enablex );
}
if( enabley != base_obj->has_vscroll ) {
if( !enabley ) {
SetScrollPos( base_obj->res_info->forms_win, SB_VERT, 0, FALSE );
}
SetScrollRange( base_obj->res_info->forms_win, SB_VERT, 0, (enabley) ?100 :0, FALSE );
ShowScrollBar( base_obj->res_info->forms_win, SB_VERT, enabley );
}
enableFormsScrollbars( base_obj, enablex, enabley );
if( !in_resize ) {
GetClientRect( base_obj->res_info->forms_win, &rect );
MoveWindow( base_obj->res_info->edit_win, 0, 0,
(rect.right - rect.left),
(rect.bottom - rect.top), TRUE );
}
UpdateScroll();
base_obj->has_hscroll = enablex;
base_obj->has_vscroll = enabley;
return( TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -