第8课 - 注释符号

  1. C语言中的符号

符号

名称

符号

名称

符号

名称

符号

名称

,

逗号

(

左圆括号

^

xor(异或)

\

反斜杠

.

圆点

)

右圆括号

-

减号

~

波折号

;

分号

[

左方括号

<

左尖括号

#

井号

:

冒号

]

右方括号

>

右尖括号

&

and(与)

?

问号

{

左大括号

!

感叹号

*

乘号

单引号

}

右大括号

|

竖线

=

等于号

双引号

%

百分号

/

斜杠

+

加号

  1. 例子

下面那些注释是正确的

(1)int/*...*/i;

正确,编译器将注释符用空格代替。

(2)    char* s = "abcdefgh      //hijklmn";

正确,注释符号放在双引号中间,就不再是注释符了。

(3)   //Is it a \

valid comment?

正确,在末尾加反斜杠引用

(4)    in/*...*/t i;

错误,编译器将注释符用空格代替。

  1. 注释规则

(1) 编译器会在编译过程删除注释,但不是简单的删除而是用空 ,但不是简单的删除而是用空格代替。

(2) 编译器认为双引号括起来内容都是字符串,双斜杠也不例外。

(3) “/*……*/”型注释,也就是多行注释形式不能被嵌套。

  1. 常犯的错误

y = x/*p

作者本意:把x除以*p的结果赋值给y

编译器:将/*作为一段注释的开始,把/*后的内容都当做注释内容,直到*/出现为止。

在编译器看来,注释和其它的程序元素都是平等的。所以,程序员不能轻视注释。

  1. 注释的好的形式

(1) 注释应该准确易懂,防止二义性,错误的注释有害而无利。

(2) 注释是对代码的提示,避免臃肿和喧宾夺主。

(3) 一目了然的代码避免加注释。

(4) 不要用缩写来注释代码,这样可能会产生误解。

(5) 注释用于阐述原因而不是用于描述程序的运行过程。

  1. 优秀的程序

下面看一下高通公司的项目平台上的一段程序:

/*

========================================================================

FILE:  Form.c

SERVICES:

GENERAL DESCRIPTION: Concrete implementation of RootForm and base IForm

methods

========================================================================

========================================================================

Copyright ?1999-2005 QUALCOMM Incorporated

All Rights Reserved.

QUALCOMM Proprietary/GTDR

========================================================================

========================================================================

*/

/*==================================================================================

XXXXXXX Confidential Proprietary

(c) Copyright XXXXXXX - All Rights Reserved

Revision History:

Modification

Author                     Date        CR Number      Major Changes

----------------------   ------------   ------------   ----------------------------

Daniel Rossler            01/18/2007     LIBkk94550    Add check for NULL pointers

in order to avoid a panic

==================================================================================*/

#include "FormBase.h"

#include "AEESoftkeyWidget.h"

#include "AEEImageWidget.h"

#include "AEEStaticWidget.h"

#include "AEEImageStaticWidget.h"

#include "AEERootContainer.h"

#include "AEEWProperties.h"

#include "AEEVectorModel.h"

#include "AEEWeb.h"

#include "AEERootForm.h"

#include "AEEResFile.h"

#include "FormUtil.h"

#include "AEEDisplayCanvas.h"

#define FORMSTACK_MIN  10

#define FORMSTACK_GROW 2

/

// RootForm

typedef struct RootForm {

Form              base;

IRootContainer *  piContainer;

AEERect           rcContainer;

AEERect           rcClient;

IVectorModel *    piForms;

ModelListener     mlFormActive;

ModelListener     mlFormTopmostNonPopup;

IWidget *         piTitle;

ImageStaticInfo   titleInfo;

IWidget *         piSoftkeys;

IWidget *         piBackground;

IWidget *         piActiveWidget;

IResFile *        piThemeFile;

const char *      themeFile;

} RootForm;

#define DECL(c) c* me = (c *)po

static __inline IForm *ROOTFORM_TO_IFORM(RootForm *me) {

return (IForm *)me;

}

static __inline Form *ROOTFORM_TO_FORM(RootForm *me) {

return (Form *)me;

}

static __inline IRootForm *ROOTFORM_TO_IROOTFORM(RootForm *me) {

return (IRootForm *)me;

}

static void RootForm_FreeFormEntry(IForm *po)

{

IFORM_Release(po);

}

static void RootForm_UpdateClientArea(RootForm *me)

{

WidgetPos pos;

WExtent titleExtent, skExtent;

if (me->piSoftkeys) {

IWIDGET_GetExtent(me->piSoftkeys, &skExtent);

// Adjust softkey position based on current height

IROOTCONTAINER_GetPos(me->piContainer, me->piSoftkeys, &pos);

pos.y = me->rcContainer.dy - skExtent.height;

IROOTCONTAINER_SetPos(me->piContainer, me->piSoftkeys, WIDGET_ZNORMAL, &pos);

} else {

SETWEXTENT(&skExtent, 0, 0);

}

if (me->piTitle) {

IWIDGET_GetExtent(me->piTitle, &titleExtent);

} else {

SETWEXTENT(&titleExtent, 0, 0);

}

// Calculate client area

SETAEERECT(&me->rcClient, 0, titleExtent.height,

me->rcContainer.dx,

me->rcContainer.dy - skExtent.height - titleExtent.height);

}

static void RootForm_UpdateTheme(RootForm *me, const char *baseName)

{

WExtent wextent;

BUIT_LOG("FORMS EVT: Update Theme Started for %s", baseName);

if (!me->piThemeFile)

return;

if (me->piTitle) {

IWIDGET_SetProperties(me->piTitle, me->piThemeFile, baseName, "Title", "Properties", 0);

IWIDGET_GetPreferredExtent(me->piTitle, &wextent);

wextent.width = me->rcContainer.dx;

IWIDGET_SetExtent(me->piTitle, &wextent);

}

if (me->piSoftkeys) {

IWIDGET_SetProperties(me->piSoftkeys, me->piThemeFile, baseName, "Softkeys", "Properties", 0);

IWIDGET_GetPreferredExtent(me->piSoftkeys, &wextent);

wextent.width = me->rcContainer.dx;

IWIDGET_SetExtent(me->piSoftkeys, &wextent);

}

if (me->piBackground) {

IWIDGET_SetProperties(me->piBackground, me->piThemeFile, baseName, "Background", "Properties", 0);

}

// Update client area since sizes may have changed

RootForm_UpdateClientArea(me);

BUIT_LOG("FORMS EVT: Update Theme Finished for %s", baseName);

}

// updates the rootform with the background image, softkey and

// title text of the TOS form.

static void RootForm_Update(RootForm *me, uint32 dwItemMask, IForm* piForm)

{

boolean bPopup = 0;

// get form's popup flag

bPopup = IFORM_GetIsPopup(piForm);

// if the form's widget has changed, update the scroll model

// for the scroll indicator in the softkey widget

if (dwItemMask & FORMITEM_WIDGET) {

IWidget *piWidget = NULL;

// get form's widget

IFORM_GetWidget(piForm, WID_FORM, &piWidget);

// update the widget and the scroll model

if (piWidget) {

// if the active widget has been changed underneath us...

if (me->piActiveWidget && piWidget != me->piActiveWidget) {

// this block will only be executed when the form widget is changed

// by the application logic while the form is active

WidgetPos pos;

WExtent we;

IWIDGET_MoveFocus(FORM_WIDGET(me), (IWidget*)WIDGET_FOCUS_NONE);

IWIDGET_GetExtent(me->piActiveWidget, &we);

IWIDGET_SetExtent(piWidget, &we);

// remove the previously active widget from the root container

if (AEE_SUCCESS == IROOTCONTAINER_GetPos(me->piContainer, me->piActiveWidget, &pos)) {

IROOTCONTAINER_Remove(me->piContainer, me->piActiveWidget);

}

// add the new widget to the root container

IROOTCONTAINER_Insert(me->piContainer, piWidget, WIDGET_ZTOPMOST, &pos);

// and remember it fondly

RELEASEIF(me->piActiveWidget);

me->piActiveWidget = piWidget;

ADDREFIF(piWidget);

// set focus to the new widget

IWIDGET_MoveFocus(FORM_WIDGET(me), piWidget);

} else if (!me->piActiveWidget) {

me->piActiveWidget = piWidget;

ADDREFIF(piWidget);

}

}

RELEASEIF(piWidget);

}

// if the form's background image has changed...

// if form is a popup, then retain the background image

// from the previous form

if (dwItemMask & FORMITEM_BACKGROUND && me->piBackground && !bPopup) {

IImage *pii = NULL;

// Try to grab the image from the new form.

IFORM_GetBGImage(piForm, &pii);

// If non-existent, try defaulting to the root form

if (!pii) IFORM_GetBGImage(ROOTFORM_TO_IFORM(me), &pii);

// Apply the result (NULL or otherwise) to our background widget

IWIDGET_SetImage(me->piBackground, pii);

RELEASEIF(pii);

}

// if the form's title text has changed...  retain previous title

// if we are a popup

if ((dwItemMask & FORMITEM_TITLE) && me->piTitle && !bPopup) {

// Release image. Text is owned by form

RELEASEIF(me->titleInfo.piImage);

IFORM_GetTextPtr(piForm, FID_TITLE, &me->titleInfo.pwText);

IFORM_GetTitleImage(piForm, &me->titleInfo.piImage);

// Set title info

IWIDGET_SetImageStaticInfo(me->piTitle, &me->titleInfo, 0);

}

// if the form's softkey text has changed...

if ((dwItemMask & FORMITEM_SOFTKEY) && me->piSoftkeys) {

IForm* piTopForm = IROOTFORM_GetTopForm(ROOTFORM_TO_IROOTFORM(me));

AECHAR *pwsz = NULL;

IWidget *piKey = NULL;

if (piTopForm == piForm) {

// set softkey 1 text

IFORM_GetTextPtr(piForm, FID_SOFTKEY1, &pwsz);

if (AEE_SUCCESS == IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY1, &piKey)) {

IWIDGET_SetText(piKey, pwsz, 0);

}

RELEASEIF(piKey);

// set softkey 2 text

IFORM_GetTextPtr(piForm, FID_SOFTKEY2, &pwsz);

if (AEE_SUCCESS == IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY2, &piKey)) {

IWIDGET_SetText(piKey, pwsz, 0);

}

}

RELEASEIF(piKey);

}

if ((dwItemMask & FORMITEM_THEME_BASENAME)) {

char *baseName = 0;

IFORM_GetThemeBaseName(piForm, &baseName);

RootForm_UpdateTheme(me, baseName);

}

}

static boolean RootForm_ReplaceWidget(RootForm *me, IWidget **piw, IWidget *piwNew, IWidget *piwBefore)

{

int        result = AEE_SUCCESS;

WidgetPos  pos;

if (*piw) {

(void) IROOTCONTAINER_GetPos(me->piContainer, *piw, &pos);

(void) IROOTCONTAINER_Remove(me->piContainer, *piw);

IWIDGET_Release(*piw);

}

if (piwNew) {

result = IROOTCONTAINER_Insert(me->piContainer, piwNew, piwBefore, &pos);

if (result == AEE_SUCCESS) {

IWIDGET_AddRef(piwNew);

} else {

piwNew = NULL;

}

}

*piw = piwNew;

// Do an update since extents may have changed

RootForm_UpdateClientArea(me);

return (AEE_SUCCESS == result);

}

static int RootForm_SetThemeName(RootForm *me, const char *themeFile)

{

if (!me->piThemeFile)

return EBADSTATE;

FREEIF(me->themeFile);

me->themeFile = STRDUP(themeFile);

IRESFILE_Close(me->piThemeFile);

if (themeFile)

return IRESFILE_Open(me->piThemeFile, themeFile);

else

return AEE_SUCCESS;

}

static int RootForm_SetDisplay(RootForm *me, IDisplay *piDisplay)

{

int nErr = AEE_SUCCESS;

IDisplayCanvas *piCanvas = 0;

nErr = ISHELL_CreateInstance(FORM_SHELL(me), AEECLSID_DISPLAYCANVAS, (void **)&piCanvas);

if (!nErr) {

WExtent extent;

WidgetPos pos;

IDISPLAY_SetClipRect(piDisplay, NULL); // reset the clipping rectangle

IDISPLAY_GetClipRect(piDisplay, &me->rcContainer);

SETAEERECT(&me->rcClient, 0, 0, me->rcContainer.dx, me->rcContainer.dy);

IDISPLAYCANVAS_SetDisplay(piCanvas, piDisplay);

IROOTCONTAINER_SetCanvas(me->piContainer, (ICanvas *)piCanvas, &me->rcContainer);

if (me->piTitle) {

// Set extent, title is already positioned at 0, 0

IWIDGET_GetExtent(me->piTitle, &extent);

extent.width = me->rcContainer.dx;

IWIDGET_SetExtent(me->piTitle, &extent);

}

if (me->piBackground) {

// Set extent, background is already positioned at 0, 0

extent.width = me->rcContainer.dx;

extent.height = me->rcContainer.dy;

IWIDGET_SetExtent(me->piBackground, &extent);

}

if (me->piSoftkeys) {

// Set extent

IWIDGET_GetExtent(me->piSoftkeys, &extent);

extent.width = me->rcContainer.dx;

IWIDGET_SetExtent(me->piSoftkeys, &extent);

// And position at bottom of screen

IROOTCONTAINER_GetPos(me->piContainer, me->piSoftkeys, &pos);

pos.y = me->rcContainer.dy - extent.height;

IROOTCONTAINER_SetPos(me->piContainer, WIDGET_ZNORMAL, me->piSoftkeys, &pos);

}

}

RELEASEIF(piCanvas);

return nErr;

}

static void RootForm_ApplyTheme(RootForm *me)

{

int nrForms, i;

if (!me->piThemeFile)

return;

nrForms = IVECTORMODEL_Size(me->piForms);

for (i = 0; i < nrForms; i++) {

IForm *piForm;

char* pTheme = 0;

IVECTORMODEL_GetAt(me->piForms, i, (void **)&piForm);

IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);

pTheme = (pTheme) ? pTheme : "(None)";

BUIT_LOG("FORMS EVT: Apply Theme Started for %s", pTheme);

IFORM_ApplyTheme(piForm);

BUIT_LOG("FORMS EVT: Apply Theme Finished for %s", pTheme);

}

if (nrForms == 0) {

char *baseName = 0;

IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &baseName);

#ifdef FEATURE_MOT_BREW

if (baseName != NULL) {

RootForm_UpdateTheme(me, baseName);

}

#else

RootForm_UpdateTheme(me, baseName);

#endif /*FEATURE_MOT_BREW*/

}

}

boolean RootForm_HandleEvent(IRootForm *po, AEEEvent evt, uint16 wParam, uint32 dwParam)

{

DECL(RootForm);

if (FORM_WIDGET(me)

&& IWIDGET_HandleEvent(FORM_WIDGET(me), evt, wParam, dwParam))

return TRUE;

if (evt == EVT_WDG_GETPROPERTY) {

switch(wParam) {

case FID_THEME_FNAME:

*(const char **)dwParam = me->themeFile;

return TRUE;

case FID_THEME_FILE:

*(IResFile **)dwParam = me->piThemeFile;

ADDREFIF(me->piThemeFile);

return TRUE;

case WID_TITLE:

*(IWidget **)dwParam = me->piTitle;

ADDREFIF(me->piTitle);

return TRUE;

case WID_SOFTKEYS:

*(IWidget **)dwParam = me->piSoftkeys;

ADDREFIF(me->piSoftkeys);

return TRUE;

case WID_BACKGROUND:

*(IWidget **)dwParam = me->piBackground;

ADDREFIF(me->piBackground);

return TRUE;

case WID_FORM:

IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)dwParam);

return TRUE;

case WID_CONTAINER:

*(IContainer **)dwParam = IROOTCONTAINER_TO_ICONTAINER(me->piContainer);

ADDREFIF(me->piContainer);

return TRUE;

default:

// Fall back on formbase

return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);

}

} else if (evt == EVT_WDG_SETPROPERTY) {

IForm *piForm = 0;

switch(wParam) {

case FID_ACTIVE:

piForm = IROOTFORM_GetTopForm(po);

if (piForm) {

// Activate or de-activate the top form

IFORM_SetProperty(piForm, FID_ACTIVE, dwParam);

}

// and invalidate root container on activation

if ((boolean)dwParam) {

IROOTCONTAINER_Invalidate(me->piContainer, 0, 0, 0);

}

return TRUE;

case FID_THEME:

RootForm_ApplyTheme(me);

return TRUE;

case FID_THEME_FNAME:

if (AEE_SUCCESS == RootForm_SetThemeName(me, (const char *)dwParam)) {

RootForm_ApplyTheme(me);

return TRUE;

}

return FALSE;

case FID_BACKGROUND:

// If we have a background widget, set the image into it

if (me->piBackground) {

IWIDGET_SetFormImage(me->piBackground, FORM_SHELL(me), (FormRes *)dwParam);

}

// Also load the image into our internal form, which will hold it as a default for other forms

return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);

case FID_DISPLAY:

return AEE_SUCCESS == RootForm_SetDisplay(me, (IDisplay *)dwParam);

case FID_WPROPS: {

WPropDesc *pdesc = (WPropDesc *)dwParam;

WResPropDesc wd;

wd.piResFile = me->piThemeFile;

if (pdesc) {

wd.args = pdesc->args;

wd.piWidget = pdesc->piWidget;

}

return IWIDGET_SetProperty(pdesc->piWidget, PROP_APPLYWPROPS, (uint32)&wd);

}

case WID_TITLE:

return RootForm_ReplaceWidget(me, &me->piTitle, (IWidget *)dwParam, WIDGET_ZNORMAL);

case WID_SOFTKEYS:

return RootForm_ReplaceWidget(me, &me->piSoftkeys, (IWidget *)dwParam, WIDGET_ZNORMAL);

case WID_BACKGROUND:

return RootForm_ReplaceWidget(me, &me->piBackground, (IWidget *)dwParam, WIDGET_ZBOTTOMMOST);

default:

// Fall back on formbase

return Form_HandleEvent(ROOTFORM_TO_IFORM(me), evt, wParam, dwParam);

}

}

// Non get/set property events are sent on to the topmost form

{

IForm *piForm = IROOTFORM_GetTopForm(po);

if (!piForm)

return FALSE;

else

return IFORM_HandleEvent(piForm, evt, wParam, dwParam);

}

}

static void RootForm_UpdateActiveListenerCB(RootForm *me, FormEvent *pEvent)

{

if (pEvent->base.evCode == EVT_MDL_FORM_CHANGE) {

RootForm_Update(me, pEvent->dwItemMask, pEvent->piForm);

}

}

static void RootForm_UpdateTopmostNonPopupListenerCB(RootForm *me, FormEvent *pEvent)

{

uint32 dwItemMask = pEvent->dwItemMask & (FORMITEM_BACKGROUND | FORMITEM_TITLE | FORMITEM_SOFTKEY);

if (pEvent->base.evCode == EVT_MDL_FORM_CHANGE && dwItemMask) {

RootForm_Update(me, dwItemMask, pEvent->piForm);

}

}

static void RootForm_ShowFormWidget(IRootForm *po, IForm *piForm, boolean bShow, boolean bFocus)

{

DECL(RootForm);

WidgetPos pos;

IWidget *piWidget;

if (!piForm)

return;

IFORM_GetWidget(piForm, WID_FORM, &piWidget);

if (!piWidget)

return;

// Set visibility

IROOTCONTAINER_GetPos(me->piContainer, piWidget, &pos);

pos.bVisible = bShow;

IROOTCONTAINER_SetPos(me->piContainer, piWidget, WIDGET_ZNORMAL, &pos);

// and set focus to the widget

if (bShow && bFocus) {

IWIDGET_MoveFocus(FORM_WIDGET(me), piWidget);

} else {

IWIDGET_MoveFocus(FORM_WIDGET(me), WIDGET_FOCUS_NONE);

}

IWIDGET_Release(piWidget);

}

/** Activates a given form.  Previous form should have been

deactivated before this is called with bActivate set

*/

static void RootForm_ActivateForm(IRootForm *po, IForm *piForm, boolean bActivate)

{

DECL(RootForm);

if (!piForm)

return;

if (bActivate) {

// Undo the currently known active widget

RELEASEIF(me->piActiveWidget);

IFORM_GetWidget(piForm, WID_FORM, &me->piActiveWidget);

// Then go update all the items except the forms widget as this is not the

// form updating its own widget. Need to update first since theme information

// affect client area which affects form activation

RootForm_Update(me, FORMITEM_ALL & ~FORMITEM_WIDGET, piForm);

// then activate

IFORM_Activate(piForm);

} else {

IFORM_Deactivate(piForm);

}

}

static int RootForm_GetFormIndex(RootForm *me, IForm **ppiForm)

{

IForm *piForm;

int nrForms;

nrForms = IVECTORMODEL_Size(me->piForms);

if (nrForms > 0) {

if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {

IVECTORMODEL_GetAt(me->piForms, nrForms - 1, (void **)ppiForm);

return nrForms - 1;

} else if (*ppiForm == FORM_FIRST) {

IVECTORMODEL_GetAt(me->piForms, 0, (void **)ppiForm);

return 0;

} else {

int i;

for (i = 0; i < nrForms; i++) {

IVECTORMODEL_GetAt(me->piForms, i, (void **)&piForm);

if (piForm == *ppiForm)

return i;

}

}

}

return -1;

}

static __inline int RootForm_GetFormInsertionIndex(RootForm *me, IForm **ppiForm)

{

int delta;

if (*ppiForm == FORM_FIRST)

return 0;

if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {

delta = 1;

} else {

delta = 0;

}

return RootForm_GetFormIndex(me, ppiForm) + delta;

}

static void RootForm_StackChange(IRootForm *po)

{

DECL(RootForm);

IForm* piTopForm = IROOTFORM_GetTopForm(po);

LISTENER_Cancel(&me->mlFormActive);

LISTENER_Cancel(&me->mlFormTopmostNonPopup);

// If there are still forms on the stack, then we need to set up several things:

//   1. The topmost form is the active form

//   2. All other forms are not active

//   3. The topmost form is being listened to via mlFormActive

//   4. The topmost non-popup form is being listened to via mlFormTopmostNonPopup

//   5. The topmost non-popup form and all popup forms on top of it are shown

//   6. Forms below the topmost non-popup form are now shown

if (piTopForm)

{

boolean bFoundTopmostNonPopup = FALSE;

IModel* piModel = NULL;

IForm*  pif;

// Logging stack change begin

BUIT_LOG("FORMS EVT: Stack Change Starting...", 1);

// Need to deal with the non-active forms first, then the active form

for (pif = piTopForm; pif; pif = IROOTFORM_GetForm(po, pif, FALSE, FALSE))

{

boolean bPopup;

bPopup = IFORM_GetIsPopup(pif);

IFORM_GetFormModel(pif, &piModel);

if (piModel)

{

if (pif != piTopForm)

{

RootForm_ShowFormWidget(po, pif, (boolean)(bFoundTopmostNonPopup? FALSE : TRUE), FALSE);

if (IFORM_IsActive(pif))

{

RootForm_ActivateForm(po, pif, FALSE);

}

}

if (!bPopup && !bFoundTopmostNonPopup)

{

IMODEL_AddListenerEx(piModel, &me->mlFormTopmostNonPopup, (PFNLISTENER)RootForm_UpdateTopmostNonPopupListenerCB, me);

if (pif != piTopForm)

// Only update if not the topmost form since the

// Activate below applies theme again The topmost

// non-popup (but not the top!) influences the

// background, title ans associated themes

RootForm_Update(me, FORMITEM_BACKGROUND | FORMITEM_TITLE | FORMITEM_THEME_BASENAME, pif);

bFoundTopmostNonPopup = TRUE;

}

}

RELEASEIF(piModel);

}

RootForm_ActivateForm(po, piTopForm, TRUE);

RootForm_ShowFormWidget(po, piTopForm, TRUE, TRUE);

IFORM_GetFormModel(piTopForm, &piModel);

if (piModel)

IMODEL_AddListenerEx(piModel, &me->mlFormActive, (PFNLISTENER)RootForm_UpdateActiveListenerCB, me);

RELEASEIF(piModel);

// Log that the form is about to be activated - all theme stuff has happened by now)

BUIT_LOG("FORMS EVT: Stack Change Finished", 1);

}

// Notify change in stack

Form_Notify(ROOTFORM_TO_FORM(me), FORMITEM_STACK);

}

int RootForm_InsertForm(IRootForm *po, IForm *piForm, IForm *pifBefore)

{

DECL(RootForm);

IWidget *piWidget = 0;

IWidget *piwBefore = 0;

IForm *pifCurrent;

int nrForms, formIndex, nErr;

if (!piForm)

return EBADPARM;

// Make sure we can insert, get the index we want to insert at

formIndex = RootForm_GetFormInsertionIndex(me, &pifBefore);

if (formIndex < 0)

return EBADPARM;

nrForms = IVECTORMODEL_Size(me->piForms);

pifCurrent = IROOTFORM_GetTopForm(po);

// Get widget to insert

IFORM_GetWidget(piForm, WID_FORM, &piWidget);

// Get widget insertion point.

if (formIndex == nrForms || !nrForms) {

piwBefore = WIDGET_ZTOPMOST;

} else if (pifBefore == FORM_FIRST) {

if (me->piBackground != NULL) {

// If we have a background widget, try to insert the form's widget

// above the background widget

piwBefore = IROOTCONTAINER_GetWidget(me->piContainer, me->piBackground, TRUE, FALSE);

if (piwBefore) {

// Add a reference, so it can be released below.

IWIDGET_AddRef(piwBefore);

}

}

if (!piwBefore) {

// No background widget, insert the form's widget at the bottom.

piwBefore = WIDGET_ZBOTTOMMOST;

}

} else {

IFORM_GetWidget(pifBefore, WID_FORM, &piwBefore);

}

// Make sure we have space for the new form

nErr = IVECTORMODEL_EnsureCapacity(me->piForms, MAX(FORMSTACK_MIN, nrForms + 1), FORMSTACK_GROW);

// Now insert

if (!nErr && piWidget && piwBefore) {

WidgetPos pos;

// Not really needed here since Activate does this to, but since

// we need to give a position on insert we may as well do it

// right

pos.x = me->rcClient.x;

pos.y = me->rcClient.y;

pos.bVisible = (piwBefore == WIDGET_ZTOPMOST);

// Insert widget into widget stack

nErr = IROOTCONTAINER_Insert(me->piContainer, piWidget, piwBefore, &pos);

}

if (!nErr) {

char* pTheme = 0;

// Add form to formstack

IVECTORMODEL_InsertAt(me->piForms, formIndex, piForm);

IFORM_AddRef(piForm);

// Set rootform

IFORM_SetProperty(piForm, FID_ROOT, (uint32)po);

// Log info

IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);

pTheme = (pTheme) ? pTheme : "(None)";

BUIT_LOG("FORMS EVT: Insert Set Theme Started for %s", pTheme);

// Set theme on new form

IFORM_ApplyTheme(piForm);

BUIT_LOG("FORMS EVT: Insert Set Theme Finished for %s", pTheme);

//RootForm_Update(me, FORMITEM_THEME, piForm);

RootForm_StackChange(po);

}

RELEASEIF(piWidget);

if (piwBefore != WIDGET_ZTOPMOST && piwBefore != WIDGET_ZBOTTOMMOST)

RELEASEIF(piwBefore);

return nErr;

}

int RootForm_RemoveForm(IRootForm *po, IForm *piForm)

{

DECL(RootForm);

IWidget *piWidget = 0;

IForm *piF = 0;

int nrForms = 0;

int formIndex;

boolean bOnlyPopups = 1;

if (me->piForms)

nrForms = IVECTORMODEL_Size(me->piForms);

if (piForm == FORM_ALL) {

while (nrForms > 0) {

IROOTFORM_RemoveForm(po, FORM_LAST);

nrForms = IVECTORMODEL_Size(me->piForms);

}

} else {

formIndex = RootForm_GetFormIndex(me, &piForm);

if (formIndex < 0)

return EBADPARM;

IFORM_GetWidget(piForm, WID_FORM, &piWidget);

if (piWidget) {

IROOTCONTAINER_Remove(me->piContainer, piWidget);

}

// Hide form widget

RootForm_ShowFormWidget(po, piForm, FALSE, FALSE);

// Deactivate form

RootForm_ActivateForm(po, piForm, FALSE);

// Tell it of rootform departure

IFORM_SetProperty(piForm, FID_ROOT, 0);

// Delete it from the stack

IVECTORMODEL_DeleteAt(me->piForms, formIndex);

RootForm_StackChange(po);

RELEASEIF(piWidget);

// Now many forms do we now have?

nrForms = IVECTORMODEL_Size(me->piForms);

}

// Cycle through remaining forms to determine type

for (piF = IROOTFORM_GetTopForm(po); piF && bOnlyPopups; piF = IROOTFORM_GetForm(po, piF, FALSE, FALSE))

{

bOnlyPopups &= IFORM_GetIsPopup(piF);

}

if ((0 == nrForms) || bOnlyPopups)

{

// If we don't have any more forms, or the only forms we do have are popups,

// ensure the title has been cleaned (the title memory is owned by the last full screen form,

// which may no longer exist).

if (me->piTitle) {

// Release image. Text is owned by form

RELEASEIF(me->titleInfo.piImage);

me->titleInfo.pwText = NULL;

// Set title info

IWIDGET_SetImageStaticInfo(me->piTitle, &me->titleInfo, 0);

}

}

if (0 == nrForms) {

// There are no more forms, ensure the softkey labels

// have been cleaned (the softkey memory is owned by the form, which may no

// longer exist).

if (me->piSoftkeys) {

IWidget *piKey = NULL;

(void) IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY1, &piKey);

if (piKey) {

IWIDGET_SetText(piKey, NULL, 0);

IWIDGET_Release(piKey);

piKey = NULL;

}

(void) IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY2, &piKey);

if (piKey) {

IWIDGET_SetText(piKey, NULL, 0);

IWIDGET_Release(piKey);

piKey = NULL;

}

}

} else {

RootForm_Update(me, FORMITEM_THEME_BASENAME, IROOTFORM_GetTopForm(po));

}

return AEE_SUCCESS;

}

void RootForm_GetClientRect(IRootForm *po, IXYContainer **ppo, AEERect *rc)

{

DECL(RootForm);

if (rc) {

*rc = me->rcClient;

}

if (ppo && me->piContainer) {

*ppo = IROOTCONTAINER_TO_IXYCONTAINER(me->piContainer);

IROOTCONTAINER_AddRef(me->piContainer);

}

}

IForm *RootForm_GetForm(IRootForm *po, IForm *pifRef, boolean bNext, boolean bWrap)

{

DECL(RootForm);

IForm *piForm = 0;

int nrForms, formIndex;

if (me->piForms == NULL)

return NULL;

nrForms = IVECTORMODEL_Size(me->piForms);

if (pifRef == NULL) {

formIndex = bNext ? 0 : nrForms - 1;

IVECTORMODEL_GetAt(me->piForms, formIndex, (void **)&piForm);

return piForm;

}

formIndex = RootForm_GetFormIndex(me, &pifRef);

if (formIndex < 0)

return NULL;

formIndex += bNext ? 1 : -1;

if (formIndex < 0) {

formIndex = bWrap ? nrForms - 1 : -1;

} else if (formIndex >= nrForms) {

formIndex = bWrap ? 0 : - 1;

}

if (formIndex < 0)

return NULL;

IVECTORMODEL_GetAt(me->piForms, formIndex, (void **)&piForm);

return piForm;

}

int RootForm_ResolveForm(IRootForm *po, char const *szFormUrl, IForm **ppiForm)

{

DECL(RootForm);

IWebUtil *piWebUtil = 0;

AEECLSID formClsId;

int result;

UrlParts parts;

char *path = 0;

if (!ppiForm || !szFormUrl)

return EBADPARM;

// Assume failure

*ppiForm = 0;

// Parse the URL

result = ISHELL_CreateInstance(FORM_SHELL(me), AEECLSID_WEBUTIL, (void **) &piWebUtil);

if (result == 0)

result = IWEBUTIL_ParseUrl(piWebUtil, szFormUrl, &parts);

// Check the scheme

if (result == 0

&& (!UP_HASSCHM(&parts) || STRNCMP(parts.cpcSchm,FORM_URL_SCHEME,sizeof(FORM_URL_SCHEME)-1)))

result = ESCHEMENOTSUPPORTED;

// Do we have a path?

if (result == 0

&& (!UP_HASPATH(&parts) || UP_PATHLEN(&parts) <= 0))

result = ESCHEMENOTSUPPORTED;

// Extract the path (we need it to be NULL terminated)

if (result == 0

&& 0 == (path = MALLOC(UP_PATHLEN(&parts)+1)))

result = ENOMEMORY;

if (result == 0) {

STRNCPY(path, parts.cpcHost, UP_PATHLEN(&parts)+1);

// Does a handler exist for this path, of type AEEIID_FORM?

if (0 == (formClsId = ISHELL_GetHandler(FORM_SHELL(me), AEEIID_FORM, path)))

// Nope...

result = ESCHEMENOTSUPPORTED;

}

if (result == 0)

// Got the actual class id, lets create the form

result = ISHELL_CreateInstance(FORM_SHELL(me), formClsId, (void **) ppiForm);

//

// TODO: We could use IWEBUTIL_ParseFormFields() to parse parts.cpcSrch

//       for known Form properties and apply them here...

RELEASEIF(piWebUtil);

FREEIF(path);

return result;

}

void RootForm_Dtor(RootForm *me)

{

IROOTFORM_RemoveForm(ROOTFORM_TO_IROOTFORM(me), FORM_ALL);

RELEASEIF(me->piTitle);

RELEASEIF(me->piSoftkeys);

RELEASEIF(me->piContainer);

RELEASEIF(me->piBackground);

RELEASEIF(me->titleInfo.piImage);

RELEASEIF(me->piForms);

RELEASEIF(me->piActiveWidget);

RELEASEIF(me->piThemeFile);

FREEIF(me->themeFile);

Form_Dtor(&me->base);

}

uint32 RootForm_Release(IRootForm *po)

{

DECL(RootForm);

if (FORM_NREFS(me) == 1)

RootForm_Dtor(me);

return Form_Release(IROOTFORM_TO_IFORM(po));

}

int RootForm_QueryInterface(IRootForm *po, AEECLSID clsid, void **ppo)

{

if (clsid == AEEIID_ROOTFORM) {

*ppo = po;

Form_AddRef(IROOTFORM_TO_IFORM(po));

return AEE_SUCCESS;

}

return Form_QueryInterface(IROOTFORM_TO_IFORM(po), clsid, ppo);

}

int RootForm_Construct(RootForm *me, AEEVTBL(IRootForm) *pvt, IModule *piModule, IShell *piShell)

{

int result;

WExtent extent;

WidgetPos pos;

IDisplay *piDisplay = 0;

ICanvas *piCanvas = 0;

Form_Ctor(&me->base, (AEEVTBL(IForm) *)pvt, piModule, piShell,

(PFNHANDLER)RootForm_HandleEvent);

pos.x = 0;

pos.y = 0;

pos.bVisible = TRUE;

SETWEXTENT(&extent, 0, 0);

// Form overrides

pvt->Release         = RootForm_Release;

pvt->QueryInterface  = RootForm_QueryInterface;

// RootForm definitions

pvt->InsertForm      = RootForm_InsertForm;

pvt->RemoveForm      = RootForm_RemoveForm;

pvt->GetClientRect   = RootForm_GetClientRect;

pvt->GetForm         = RootForm_GetForm;

pvt->ResolveForm     = RootForm_ResolveForm;

result = ISHELL_CreateInstance(piShell, AEECLSID_VECTORMODEL, (void **)&me->piForms);

if (result == 0) {

IVECTORMODEL_SetPfnFree(me->piForms, (PFNNOTIFY)RootForm_FreeFormEntry);

result = ISHELL_CreateInstance(piShell, AEECLSID_DISPLAY, (void **)&piDisplay);

}

if (result == 0)

result = ISHELL_CreateInstance(piShell, AEECLSID_ROOTCONTAINER, (void **)&me->piContainer);

if (result == 0)

result = IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)&me->base.piWidget);

if (result == 0)

result = ISHELL_CreateInstance(piShell, AEECLSID_RESFILE, (void **)&me->piThemeFile);

if (result == 0)

result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGEWIDGET, (void **)&me->piBackground);

if (result == 0) {

IWIDGET_SetFlags(me->piBackground, IDF_ALIGN_RIGHT | IDF_ALIGN_BOTTOM);

// Insert, extent will be fixed up in SetDisplay below

result = IROOTCONTAINER_Insert(me->piContainer, me->piBackground, WIDGET_ZBOTTOMMOST, &pos);

}

if (result == 0)

// Construct title

result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGESTATICWIDGET, (void **)&me->piTitle);

if (result == 0) {

extent.height = 15;

// Set title font to bold by default.  Apps and themes can override it.

IWIDGET_SetFontClass(me->piTitle, AEECLSID_FONTSYSBOLD);

IWIDGET_SetShadowOffsetY(me->piTitle, 0);

IWIDGET_SetBorderWidth(me->piTitle, 0);

IWIDGET_SetExtent(me->piTitle, &extent);

// Add to container

result = IROOTCONTAINER_Insert(me->piContainer, me->piTitle, WIDGET_ZTOPMOST, &pos);

}

if (result == 0)

// Construct Softkeys

result = ISHELL_CreateInstance(piShell, AEECLSID_SOFTKEYWIDGET, (void **)&me->piSoftkeys);

if (result == 0) {

IWIDGET_SetShadowOffsetY(me->piSoftkeys, -1);

IWIDGET_SetBorderWidth(me->piSoftkeys, 0);

IWIDGET_SetExtent(me->piSoftkeys, &extent);

IWIDGET_SetLeftPadding(me->piSoftkeys, 2);

IWIDGET_SetRightPadding(me->piSoftkeys, 2);

// Insert at 0, 0. Correct positioning will happen in SetDisplay

result = IROOTCONTAINER_Insert(me->piContainer, me->piSoftkeys, WIDGET_ZTOPMOST, &pos);

}

if (result == 0)

result = RootForm_SetDisplay(me, piDisplay);

if (result == 0) {

char* pTheme = 0;

IFORM_SetThemeBaseName(ROOTFORM_TO_IFORM(me), "Root");

IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme);

pTheme = (pTheme) ? pTheme : "(None)";

BUIT_LOG("FORMS EVT: Construct Set Theme Started for %s", pTheme);

IROOTFORM_SetThemeFileName(ROOTFORM_TO_IROOTFORM(me), "theme.bar");

BUIT_LOG("FORMS EVT: Construct Set Theme Finished for %s", pTheme);

} else {

RootForm_Dtor(me);

}

RELEASEIF(piDisplay);

RELEASEIF(piCanvas);

return result;

}

int RootForm_New(IRootForm **ppo, IModule *piModule, IShell *piShell)

{

RootForm *me = MALLOCREC_VTBL(RootForm, IRootForm);

int result;

*ppo = (IRootForm *)me;

if (!me)

return ENOMEMORY;

result = RootForm_Construct(me, GETVTBL(me, IRootForm), piModule, piShell);

if (result != 0) {

*ppo = NULL;

FREE(me);

}

return result;

}

转载于:https://www.cnblogs.com/free-1122/p/9702618.html

C语言-第8课 - 注释符号相关推荐

  1. c语言深度剖析(12)—注释符号

    1. 似是而非的问题 下面的注释是正确的吗? #include<stdio.h>int main() {int/**/i; //合法int i;char* s = "abcdef ...

  2. c语言注释符号 井号,读c语言深度剖析 -- 符号 注释符号

    标准C语言的基本符号 ,逗号  >右尖括号  . 圆点 !感叹号   :分号   | 竖线   :冒号  /斜杠   ?问号  \反斜杠 '单引号  ~波折号  "双引号  #井号   ...

  3. C语言注释符号一本道来

    注释符号 1.注释 一个好的注释 好的注释(摘自网络) 注释应该准确易懂,防止二义性,错误的注释有害. 注释是对代码的提示,避免臃肿和喧宾夺主. 一目了然的代码避免加注释. 不要用缩写来注释代码,这样 ...

  4. C语言字符糊到了一起,C语言速成及格课.docx

    C语言速成及格课.docx 目录:1. C语言概要 2.变量 3.计算 4.判断 5.循环 6.函数 7.数组 8.指针 9.字符(串)附录1:学习C语言的方法.附录2:编程的一些技巧.附录3:使用电 ...

  5. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  6. Python|SQL详解之DDL|DML|DQL|DCL|索引|视图、函数和过程|JSON类型|窗口函数|接入MySQL|清屏|正则表达式|executemany|语言基础50课:学习(14)

    文章目录 系列目录 原项目地址 第41课:SQL详解之DDL 建库建表 删除表和修改表 第42课:SQL详解之DML insert操作 delete 操作 update 操作 完整的数据 第43课:S ...

  7. Python|http|Chrome Developer Tools|Postman|HTTPie|builtwith库|python-whois库|爬虫及解析|语言基础50课:学习(10)

    文章目录 系列目录 原项目地址 第31课:网络数据采集概述 爬虫的应用领域 爬虫合法性探讨 Robots协议 超文本传输协议(HTTP) 相关工具(Chrome Developer Tools.Pos ...

  8. Python|Git remote|hosts|PyCharm常用快捷键|变量转换|命名|类型|运算符|分支|调整tab|循环|语言基础50课:学习记录(1)-项目简介及变量、条件及循环

    目录 系列目录 均引自原项目地址: Python语言基础50课简介及相关网址 修改 hosts 文件 解决 GitHub 上图片无法显示 视频资源 Python语言基础50课代码等文件资源 表1. P ...

  9. Python|xlwt|xlrd|调整单元格样式(背景,字体,对齐、虚线边框、列宽行高、添加公式)|xlutils|openpyxl|只读与只写|图表|语言基础50课:学习(8)

    文章目录 系列目录 原项目地址 第24课:用Python读写Excel文件-1 Excel简介 安装 读Excel文件(行列索引从`0`开始) 写Excel文件 调整单元格样式(背景,字体,对齐.虚线 ...

最新文章

  1. IPhone之AVAudioRecorder
  2. Chroot vsftpd with non-system users (ftp)
  3. Nacos源码覆盖实例列表
  4. windows生成dump文件
  5. mysql 工时统计_有如下数据,要统计1月3号工时不足8小时的员工姓名及总工时,该sql语句该怎么写(用的mysql哈)...
  6. 从淘宝来看后端架构发展
  7. 雄安新区区块链底层系统(1.0)今日正式发布
  8. linux usb 同步传输,从设备到主机的用户模式USB等时传输
  9. 机器学习笔记(二十六):支撑向量机(SVM)
  10. mysql数据迁移到sqlserver_技术分享 | 使用OGG实现Oracle到MySQL数据平滑迁移
  11. 浅聊信创投资研究框架| 信创
  12. opencv3错误集锦(四)——Rect函数参数引发的异常中断
  13. [论文总结] 深度学习在农业领域应用论文笔记8
  14. 互联网30年,泡沫如梦,一个个泡沫和风口过后,会是什么样的结局
  15. golang base64解码碰到的坑
  16. python数据处理-整理表格数据
  17. Barefoot Networks进军白盒市场
  18. 明年春天见!罗永浩发声:还完债当天就重返科技行业
  19. Adobe Photoshop快捷键_艾孜尔江摘录
  20. CString怎么转成LPVOID的问题 vc/mfc

热门文章

  1. Linux 命令之 unzip -- 解压缩文件
  2. Linux 命令之 type -- 显示指定命令的类型
  3. 3制造数据集_基于MBD的产品设计制造技术研究
  4. string index out of range_Java 12 骚操作, String居然还能这样玩!
  5. FFmpeg NDK跨平台交叉编译
  6. 嵌入式C语言的7个硬核知识
  7. 可禁用计算机服务,win10哪些服务可以禁用 服务哪些可以禁止启动
  8. vue router 参数_Vue.js项目开发技术解析
  9. mysql 分词搜索_实战 | canal 实现Mysql到Elasticsearch实时增量同步
  10. java stream 分组求和_Java stream List 求和、分组操作