C语言注释符号
同学们认为注释很简单,那我来看看下面的代码是否正确?
1.似是而非的问题
int main()
{
int/*...*/i;
char* s = "abcdefgh //hijklmn";
//Is it a \ //
valid comment?
in/*...*/t i;
return ; }
你的答案是什么呢?
答案:
只有第七行出错。
2.注释规则
编译器在编译过程中使用空格替换整个注释
字符串字符串字面量中的 // 和 /*...*/不代表注释符号
/*......*/型注释不能被嵌套(在分段排除异常往往被忽略)
3.有趣的问题
你觉得y=x/*p是什么意思?
作者本意:
把x除以*p的结果赋值给y。
编译器:
将/*作为一段注释的开始,把/* 后面的内容都当成注释内容,直到*/出现为止。
在编译器看来,注释和其它程序元素是平等的,因此,作为工程师不能轻视注释,可以用x/ *p表示(空格的重要性)
(1)、教科书式注释:
r = n / ; //r是n的一半
while( ( r - n / r ) <= t) //循环,仅当r-n/r不大于t
{ }
r=r+n*t; //对变量r进行赋值 n++; //变量n自增1
注释用于阐述原因和意图而不是描述程序的运行过程!上面的注释一点用都没有!!!!
(2)、迷惑型注释:
init(); //...... sad = 0x723; //R.I.P.L.V.B. //...... finalize();
解释:Rest in piece , Ludwig Van Benthoven, 0x723(16)=1827(10) 原作者看到这行代码,怀恋贝多芬!!
写注释不是晒心情,必须无二义性,起到对代码进行提示的作用,避免使用缩写
(3)、忽悠型注释:
// ... ...
// ... ... // BOB 07/24/1995
/* 我知道这个问题很难解决而且
* 现在必须依赖于这个 contains 函数,
* 但我以后会用一种更加直观优雅有意义的方式
* 重写着段代码。
* 现在这么做只是由于时间紧迫,但我一定会解决。
*/ if( contains(s, "error" ) )
{
exit();
}
// ... ... // ... ...
然而一直没改
注释是对代码的提示,避免臃肿和喧兵夺主
(4)、搞笑型注释:
/**
* _ooOoo_
* o8888888o
* 88" . "88
* (| -_- |)
* O\ = /O
* ____/`---'\____
* .' \\| |// `.
* / \\||| : |||// \
* / _||||| -:- |||||- \
* | | \\\ - /// | |
* | \_| ''\---/'' | |
* \ .-\__ `-` ___/-. /
* ___`. .' /--.--\ `. . __
* ."" '< `.___\_<|>_/___.' >'"".
* | | : `- \`.;`\ _ /`;.`/ - ` : | |
* \ \ `-. \_ __\ /__ _/ .-` / /
* ======`-.____`-.___\_____/___.-`____.-'======
* `=---='
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* 佛祖保佑 永无BUG
* 佛曰:
* 写字楼里写字间,写字间里程序员;
* 程序人员写程序,又拿程序换酒钱。
* 酒醒只在网上坐,酒醉还来网下眠;
* 酒醉酒醒日复日,网上网下年复年。
* 但愿老死电脑间,不愿鞠躬老板前;
* 奔驰宝马贵者趣,公交自行程序员。
* 别人笑我忒疯癫,我笑自己命太贱;
* 不见满街漂亮妹,哪个归得程序员?
*/
4.小结
注释应该精准易懂,防止二义性,错误的注释有害无利
注释是对代码的提示,避免臃肿和喧兵夺主
一目了然的代码避免加注释
不要用缩写来注释代码,这样可能产生误解
注释用来阐述原因和意图而不是描述程序的运行机制
5.漂亮的注释
/*
========================================================================
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, , );
}
if (me->piTitle) {
IWIDGET_GetExtent(me->piTitle, &titleExtent);
} else {
SETWEXTENT(&titleExtent, , );
}
// Calculate client area
SETAEERECT(&me->rcClient, , 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", );
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", );
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", );
}
// 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 = ;
// 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, );
}
// 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, );
}
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, );
}
}
RELEASEIF(piKey);
}
if ((dwItemMask & FORMITEM_THEME_BASENAME)) {
char *baseName = ;
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 = ;
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, , , 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 = ; i < nrForms; i++) {
IForm *piForm;
char* pTheme = ;
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 == ) {
char *baseName = ;
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 = ;
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, , , );
}
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 > ) {
if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {
IVECTORMODEL_GetAt(me->piForms, nrForms - , (void **)ppiForm);
return nrForms - ;
} else if (*ppiForm == FORM_FIRST) {
IVECTORMODEL_GetAt(me->piForms, , (void **)ppiForm);
return ;
} else {
int i;
for (i = ; i < nrForms; i++) {
IVECTORMODEL_GetAt(me->piForms, i, (void **)&piForm);
if (piForm == *ppiForm)
return i;
}
}
}
return -;
}
static __inline int RootForm_GetFormInsertionIndex(RootForm *me, IForm **ppiForm)
{
int delta;
if (*ppiForm == FORM_FIRST)
return ;
if (*ppiForm == FORM_LAST || *ppiForm == FORM_DEFAULT) {
delta = ;
} else {
delta = ;
}
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...", );
// 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", );
}
// 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 = ;
IWidget *piwBefore = ;
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 < )
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 + ), 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 = ;
// 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 = ;
IForm *piF = ;
int nrForms = ;
int formIndex;
boolean bOnlyPopups = ;
if (me->piForms)
nrForms = IVECTORMODEL_Size(me->piForms);
if (piForm == FORM_ALL) {
while (nrForms > ) {
IROOTFORM_RemoveForm(po, FORM_LAST);
nrForms = IVECTORMODEL_Size(me->piForms);
}
} else {
formIndex = RootForm_GetFormIndex(me, &piForm);
if (formIndex < )
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, );
// 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 (( == 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, );
}
}
if ( == 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, );
IWIDGET_Release(piKey);
piKey = NULL;
}
(void) IWIDGET_GetSoftkey(me->piSoftkeys, PROP_SOFTKEY2, &piKey);
if (piKey) {
IWIDGET_SetText(piKey, NULL, );
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 = ;
int nrForms, formIndex;
if (me->piForms == NULL)
return NULL;
nrForms = IVECTORMODEL_Size(me->piForms);
if (pifRef == NULL) {
formIndex = bNext ? : nrForms - ;
IVECTORMODEL_GetAt(me->piForms, formIndex, (void **)&piForm);
return piForm;
}
formIndex = RootForm_GetFormIndex(me, &pifRef);
if (formIndex < )
return NULL;
formIndex += bNext ? : -;
if (formIndex < ) {
formIndex = bWrap ? nrForms - : -;
} else if (formIndex >= nrForms) {
formIndex = bWrap ? : - ;
}
if (formIndex < )
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 = ;
AEECLSID formClsId;
int result;
UrlParts parts;
char *path = ;
if (!ppiForm || !szFormUrl)
return EBADPARM;
// Assume failure
*ppiForm = ;
// Parse the URL
result = ISHELL_CreateInstance(FORM_SHELL(me), AEECLSID_WEBUTIL, (void **) &piWebUtil);
if (result == )
result = IWEBUTIL_ParseUrl(piWebUtil, szFormUrl, &parts);
// Check the scheme
if (result ==
&& (!UP_HASSCHM(&parts) || STRNCMP(parts.cpcSchm,FORM_URL_SCHEME,sizeof(FORM_URL_SCHEME)-)))
result = ESCHEMENOTSUPPORTED;
// Do we have a path?
if (result ==
&& (!UP_HASPATH(&parts) || UP_PATHLEN(&parts) <= ))
result = ESCHEMENOTSUPPORTED;
// Extract the path (we need it to be NULL terminated)
if (result ==
&& == (path = MALLOC(UP_PATHLEN(&parts)+)))
result = ENOMEMORY;
if (result == ) {
STRNCPY(path, parts.cpcHost, UP_PATHLEN(&parts)+);
// Does a handler exist for this path, of type AEEIID_FORM?
if ( == (formClsId = ISHELL_GetHandler(FORM_SHELL(me), AEEIID_FORM, path)))
// Nope...
result = ESCHEMENOTSUPPORTED;
}
if (result == )
// 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) == )
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 = ;
ICanvas *piCanvas = ;
Form_Ctor(&me->base, (AEEVTBL(IForm) *)pvt, piModule, piShell,
(PFNHANDLER)RootForm_HandleEvent);
pos.x = ;
pos.y = ;
pos.bVisible = TRUE;
SETWEXTENT(&extent, , );
// 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 == ) {
IVECTORMODEL_SetPfnFree(me->piForms, (PFNNOTIFY)RootForm_FreeFormEntry);
result = ISHELL_CreateInstance(piShell, AEECLSID_DISPLAY, (void **)&piDisplay);
}
if (result == )
result = ISHELL_CreateInstance(piShell, AEECLSID_ROOTCONTAINER, (void **)&me->piContainer);
if (result == )
result = IROOTCONTAINER_QueryInterface(me->piContainer, AEEIID_WIDGET, (void **)&me->base.piWidget);
if (result == )
result = ISHELL_CreateInstance(piShell, AEECLSID_RESFILE, (void **)&me->piThemeFile);
if (result == )
result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGEWIDGET, (void **)&me->piBackground);
if (result == ) {
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 == )
// Construct title
result = ISHELL_CreateInstance(piShell, AEECLSID_IMAGESTATICWIDGET, (void **)&me->piTitle);
if (result == ) {
extent.height = ;
// Set title font to bold by default. Apps and themes can override it.
IWIDGET_SetFontClass(me->piTitle, AEECLSID_FONTSYSBOLD);
IWIDGET_SetShadowOffsetY(me->piTitle, );
IWIDGET_SetBorderWidth(me->piTitle, );
IWIDGET_SetExtent(me->piTitle, &extent);
// Add to container
result = IROOTCONTAINER_Insert(me->piContainer, me->piTitle, WIDGET_ZTOPMOST, &pos);
}
if (result == )
// Construct Softkeys
result = ISHELL_CreateInstance(piShell, AEECLSID_SOFTKEYWIDGET, (void **)&me->piSoftkeys);
if (result == ) {
IWIDGET_SetShadowOffsetY(me->piSoftkeys, -);
IWIDGET_SetBorderWidth(me->piSoftkeys, );
IWIDGET_SetExtent(me->piSoftkeys, &extent);
IWIDGET_SetLeftPadding(me->piSoftkeys, );
IWIDGET_SetRightPadding(me->piSoftkeys, );
// Insert at 0, 0. Correct positioning will happen in SetDisplay
result = IROOTCONTAINER_Insert(me->piContainer, me->piSoftkeys, WIDGET_ZTOPMOST, &pos);
}
if (result == )
result = RootForm_SetDisplay(me, piDisplay);
if (result == ) {
char* pTheme = ;
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 != ) {
*ppo = NULL;
FREE(me);
}
return result;
}
C语言注释符号的更多相关文章
- C语言进阶——注释符号12
注释可能大认为非常简单,但是注释其实在C语言中很关键,来看下面一段对话. ---学生: 老师,我觉得注释没有必要深究,因为很简单,对程序功能也没有影响. ---老师: 注释是C语言最重要的工具,我们先 ...
- c语言运算符号的优先级
c语言运算符号的优先级 本文来自百度搜索只为查看方便 优先级等级口诀: 圆方括号.箭头一句号, 自增自减非反负.针强地址长度, 乘除,加减,再移位, 小等大等.等等不等, 八位与,七位异,六位或,五与 ...
- go语言注释
Go语言注释实例代码教程 - Go支持C语言风格的/* */块注释,也支持C++风格的//行注释. 当然,行注释更通用,块注释主要用于针对包的详细说明或者屏蔽大块的代码. 每个包都应有一个包注解,即 ...
- sql语句中的注释符号
sql语句中的注释符号 mysql # 到该行结束.-- 到该行结束 以及 的注释方格:mysql> SELECT 1+1; # 这个注释直到该行结束mysql> SELE ...
- 【C语言】符号优先级
一. 问题的引出 今天看阿里的笔试题,看到一个非常有意思的题目,但是很容易出错. 题目:如下函数,在32bit系统foo(2^31-3)的值是: Int foo(int x) { return x&a ...
- MySQL注释符号
今天在执行mysql语句时很奇怪为什么没有执行,查询后发现“-- ”是mysql的注释符号,不会执行的 mysql注释符有三种: 1.#... 2."-- ",注意--后面有一个 ...
- MySQL中的注释符号的使用
前言 在学习MySQL的过程中,因为目前接触的语法简单,所以实在没有想到过加入注释.在写博客使用Markdown时,突然想用注释语句,所以便百度了一下,引用了这一篇转载博客. MySQL中的注释符号有 ...
- C#语言注释详解
C#语言注释有三种形式 C#语言注释有三种形式 第一种是多行注释: /* */ 例如: /* int a=1; int b=2; int c=3; */// 第二种是单行注释: 例如: // int ...
- c语言运算符号详细说明
C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符.其它都是左结合性. 判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺 ...
随机推荐
- ORACLE10G非归档模式下RMAN异机迁库
环境信息: 源库 目标库 操作系统 WIN7 WIN SVR 2012 R2 IP x.x.x.216 x.x.x.112 数据库版本 10.2.0.4.0 - 64bi 10.2.0.4.0 - 6 ...
- W25Q64BV(FLASH)(SPI)中文手册
64兆位串行SPI FLASH存储器 1.常规介绍 W25Q64BV(64兆位)串行FLASH存储器为一个空间大小,引脚,功耗限制的系统提供解决方案.25Q系列的灵活性和性能良好超越了普通的串行FLA ...
- SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
- 【笔记】机器学习 - 李宏毅 - 11 - Keras Demo2 & Fizz Buzz
1. Keras Demo2 前节的Keras Demo代码: import numpy as np from keras.models import Sequential from keras.la ...
- PIE-SDK For C++矢量数据的投影转换
1.功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式,每一种数据都可以对投影进行转换,目前PIE SDK支持矢量和栅格数据的投影转换功能,下面对矢量数据的投影转换功能进行介绍. 2.功 ...
- MySQL优化(四)——读写分离
1.MySQL高可用 主从复制 一主多备 多主多备 读写分离 减少IO开销,防止阻塞等等 2.主从复制参考 https://www.cnblo ...
- 洛谷P1936 水晶灯火灵 P1775 古代人的难题_NOI导刊2010提高(02)【重题请做P1936】
首先我要说明,此题(古代人的难题)与水晶灯火灵是一模一样的! 古代人的难题 (File IO): input:puzzle.in output:puzzle.out 时间限制: 1000 ms 空间 ...
- Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...
- Hangfire设置隔天的指定时间执行
一.说明 一开始只需要每天执行指定的备份逻辑,后来需求变更为间隔X天的指定时间执行备份操作,于是有了本篇文章所述的操作. 二.代码 1.先执行间隔天数的逻辑. 2.当到达要备份的当天时,再添加一个任务 ...
- 安装oracle client及配置
一.下载oracle client 下载地址:https://www.oracle.com/technetwork/database/enterprise-edition/downloads/1120 ...