自家的服装给他穿,用SonicUI引擎达成常见UI效果

在一起

   
 道理都懂,说人家都掌握掌握,到了和睦全都失效,不是避让,而是不能够面对。

几个开源的库很科学。

千禧年前一天晚间捌点零陆分,在香港(Hong Kong)服装高校门口的本人,已搞好努尔娜古丽失约希图的时候。她弹指间出现在校门口并壹溜烟跑到小编前边。

   
 平素不回避单身这么些标题,不过要真正敞满面春风扉去说,好像又没什么可说的。好争论的事情,每趟都理不出1个端倪!

作者Blog:http://hi.csdn.net/space-157361.html

“你的手套给本人戴。”努尔娜古丽在自己前边单手合拾上下搓动,嘴巴往手掌呵着热气,双脚来回跺地。她从不穿毛衣,只有1件单薄的反动羽绒服在身上。除外,作者还留意到他把头发剪短了。长度刚好落在脖子的限度,1侧的刘海用发卡一丝不乱地拢住。

   
爱人大概被爱自身都并未有抗拒,但老是认为温馨少了部分怎么,是年少时的兴奋,还是初恋时的能够,亦只怕未来的无关痛痒,真的不能够去描绘那种认为。有时作者也难以置信自身是还是不是实在不欣赏男士了,答案自然是一定的,毕竟作者没对哪些闺蜜有那种有情人的迷恋和据为己有欢愉,这就足以申明全体了。

vckBase 页面:http://www.vckbase.com/document/viewdoc/?id=1849

“哦。”我应了一声,摘入手套递给他。努尔娜古丽接过手套拿住手上没戴。

    那到底是少了哪些吗?小编也要究其根源。

源代码下载: http://www.codeproject.com/KB/GDI/SonicUI.aspx

自己脑子里转了三个观念:天冷,作者的衣服给他穿。随即脱下衬衣罩在她随身。“穿那样少服装?穿自身的。”

   
多久没有恋爱了,不记得了,不是小编绝情,真的是回忆力倒霉,那点自个儿很庆幸,毕竟何人也不能够接贰连3活在追忆里呢!努力过好今后才是相应做的事。

让UI开采轻便而喜欢,用SonicUI引擎达成常见UI效果

“不用,不用。”努尔娜古丽摇摇手。作者衬衣已脱下,也糟糕再穿回来,于是拿住手上。在零下十几度的露天,未有厚衣裳刹那就会被冻透。作者不理解努尔娜古丽在打什么算盘。

   
不谈恋爱是因为尚未那么三个对的人,懂小编的一声不响,永世在本人1转身的地点守护自身,尽管不知情有未有这样的壹人,然而本人乐意等,晚点并未有关系,只借使你,小编就不怕晚。

作者:Sonic

她不停地搓手、跺脚,说:“好冷啊,好冷啊。”冷还不穿衣饰,女生真是1种难以置信的古生物。

牵手看世界

下载源代码

她好像等着自己说怎么样话,显著温度不属于他关切的话题。

    关于婚恋和婚姻总是有说不完的话题,终归唯有那两件事时有产生的轶事最多。

摘要:作为windows程序猿,UI开拓是无可幸免的做事,无论你是写2个供应和贩卖存系统,仍然壹款聊天IM,UI开荒连接会占有你多量的岁月。接下来展示的将是一种windows下的卓殊轻便便捷的UI开辟化解方案,完成我们实在职业中不时必要完毕的UI特效,力争将您从犬牙交错的UI工作中解放出来,将注意力投入到更有挑衅性的干活中去。

疑忌间,作者再度注意到了她的新发型,须臾间作者发觉到应该夸赞她,女人总是介意本身是否被人家关怀:“你剪头发了啊?很为难。”

 
 恋爱那件事确实很奇幻,有的人得以一见还是,有的人方可日久生情,有的人方可到处滥情,有的人得以婚外情,到底是何许来头作育那些情感的面世,尽管有光明,不过也有正剧!

首要字:UI引擎 异形窗体 动画按键 gdi引擎 自绘控件 轻巧

因此看来笔者说会话了,努尔娜古丽好像就在等笔者说那句,她两眼发亮。“原来眼睛真会发亮。”此前,笔者对教材关于眼睛发光的写照呲之以鼻,今后自己真实确确意识到温馨错了。

 
 幸福的情意大都相似,不幸的柔情就各有各的倒霉。多数爱情传说都起来的炫丽美好,一路都感到那壹世正是互为的归宿了,但最后却自行消灭的收尾了,原因实在相当粗略,恋爱时互相看到的都是对方的独到之处,哪怕有瑕疵也会认为那是可爱的;可是只要生活在共同了,未有了相恋时候的激情和甜美,未有了那么些幸福的小欣喜,唯有自顾自的分级安好,你认为还有爱情可言吗?所以爱情是要靠五人去经营的。

用作windows工程师,UI开垦是无可防止的劳作,无论你是写1个供应和出售存系统,依然一款聊天IM,UI开辟连接会占领你大量的年华。前些时间在铺子开辟项目中,带着有个别私心落成了1个构想了较长时间的UI引擎,自已在选择进度中以为到相当的大的加快了UI开辟的频率,希望与大家享受,并用大家的提议来不断完
善。

“是啊。早晨刚剪的。剪后洗完澡,一看八点了。小编想完了,你在等我,小编就跑了出去,半袖都没穿。你真感到难堪?”

   
生活中有不缺患难的爱情传说,太几人叫苦不迭成婚了,他就不爱笔者了,作者买新行头她也不夸我能够,笔者收十房间他也不帮本人联合了,笔者学了新菜他却不回去吃了,笔者想看电影他却接飞速⋯⋯那样的事务太多了,其实爱情有时真的不是并吞和牵绊,没有错你们是结合了,他是理所应当适用的分摊家务,适当的跟你性感,然而也毫不去束缚他的生存,毕竟男人都是职业中央,究竟她以为养家糊口是她的职责,所以您要适宜的学会独立,多作育一些兴趣爱好,没什么坏处。

接下去将以多少个在骨子里专门的职业湖北中国广播集团泛的UI开拓难点为例,介绍落成格局及效益,相信那多少个难题能引起客户端UI开采同仁的共鸣。
一.多格式图片帮助
2.文字和超链接
叁.自绘开关
四.脏管理与区域刷新
5.异形窗体(包罗像素级透明异形窗体)

自身端详努尔娜古丽,她的新发型和大双目、长方型脸型切磋斟酌,看上去就好像漫画书里的美青娥。“赏心悦目,像短头发的美青娥战士。”

   
 为啥今后的女强人那么多,还有五个还算好听的名字“女男士”,一方面是社会压力大,还有3只正是巾帼觉醒了,不是成婚以往就终日只围着爱人孩子转悠了,她们也领略本人赚钱本身花了,究竟手心向上花外人钱不是非常的硬气,其实一向以为做女孩子将要如此,具备扬在脸颊的自信,长在内心的善良,用自身微小之力做一些作业,不是要赚多少钱,只是为着彰显团结的市场股票总值,就是因为这样,所以单身的农妇多了起来!

1.多格式图片帮忙
UI开荒离不开图片,windows的api提供了部分加载图片的格局,如常用的LoadImage,使用极粗略。但其功效也跟其用法一样轻松,只可以加载
bmp,ico等二种格式。深入人心,bmp是不带阿尔法通道的,壹旦须求贯彻阴影等阿尔法渐变的意义,系统提供的api就有个别捉襟见肘了。当然
很五人会想到远近闻名的CxImage,那也是个不错的选取。我在里头也是包裹了CxImage支持加载和保留多格式的图纸,但加载之后的图像数据管理都以自管理的了,因为CxImage在拍卖汉兰达GB转hsl,旋转等特效时多量用到了浮点运算,成效不可能使人十二分满足。作者把全数的浮点运算都转为整形运算,并
大批量应用了SSE贰指令举行优化,实地衡量声明在旋转,HSL调换,灰化等特效时,功能能够增长四-拾倍(CPU为T2330
1.六GHz)。图片加载援助两种形式:从文件;从财富;从dc。必要注明的是从财富加载时请将能源类型命名称为IMAGE。
演示代码如下:

“可那三个什么人偏说倒霉看。”

爱你的人生怕给您的不够

//GetSonicUI是引擎导出的唯一函数,是类厂和引擎总控,负责创建对象和销毁对象等。
ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
pImg->Draw(hdc, 10, 10);
GetSonicUI()->DestroyObject(pImg);

“谁?”

   
大概老1辈人就以为,这一个岁数将要成婚生子,立室立业,尤其女孩子平素毫无太拼,其实社会早已经翻云覆雨了,女子同样可以当家做主,自强不息。

OK,1个带透明通道的png图片绘制就产生了,是或不是轻便惬意。

“不说了。陪本身回宿舍。小编穿件马夹。”

   
喜欢的东西本人渔利买,想去游览自个儿谋取利益去,不须求等待或许祈求别人的赋予,自个儿想要的生存为啥要靠外人给啊?固然外人给了,也不社长久的。当您买200块钱的东西都要找汉子要的时候,追你的人就会知晓花300块钱就能博你1笑,花500块钱泡你就是1种浪费;当您花陆仟块钱买东西都不眨眼的时候,土冒是不会贴近你的,因为他驾驭要博你①笑的礼金起码要陆位数。要外人爱你,首先你要学会爱自个儿,自个儿都舍得对团结好,为啥奢望外人那么对您?

二.文字和超链接
UI开荒进度中平日最费劲的是绘制文字,要求您不停的开头化字体,设定字体属性,若是产品人士须求文字按一定的格式排版或输出彩色文字,那几乎正是咱们的
恐怖的梦了。而在和煦的分界面出席超链接,网樱笋时经有繁多示范代码了,但自己相信ISonicString是3个更简约的贯彻方案。ISonicString是1个能够拓展音信交互的UI组件对象。只供给像html语言同样参与一些像样的调控符,你就足以随便的主宰字体的尺寸颜色,超链接等性情,分外有益。

充裕什么人是哪个人?梁夏?应该不是?是老大圣诞夜那多少个淡青羽绒服男吗。一点也不快活归一点也不快活,作者防止住心境,把西服披在努尔娜古丽身子。她这一次未有拒绝。

    最棒的情意毕竟该是什么体统的吧?

ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x, a='http://hi.csdn.net/zskof', font, font_height=16/点我打开链接", #0000ff);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
    HDC hdc;
   switch (message) 
  {
  case WM_PAINT:
     {
          hdc = BeginPaint(hWnd, &ps);
           pStr->TextOut(hdc, 0, 0, hWnd);
         EndPaint(hWnd, &ps);
       }
      break;
 }
  .
  .
  .
}

自己和她走入学校。

   
各自安好,依旧互不干扰。其实应当是互为独立生存,但又至关重要。每种男士都不欢被女生束缚,严加看管,走到哪儿都要带着你,因为她也急需私人空间;种种妇女也不喜欢被娃他爹2肆查岗,恨不得上个厕所也要告知问一下,生怕你有啥样他不清楚的事。所以要知道适度的调换和联络,不要强加给互相爱的担任,究竟婚姻是有任务的,它与结婚恋爱分裂。

如何,只须求成立,然后像CString的Format同样格式化3个字符串,在WM_PAINT响应中输出就可以,只必要三步,你就赚取了壹行水晶色的成效完整的超链接,是或不是很有益。通过调控字符,你还能设定下划线的体制,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的注释就能够。
ISonicString也得以将文字和图表混合输出,或使图片带有超链接属性,须要用’p’调整符钦命八个ISonicImage的id:

前些天他为什么不和丰富胸罩男出去约会呢?努尔娜古丽上了宿舍楼,笔者在宿舍1楼等待时连连自找烦恼。

 
 无论经历哪些的人生,都愿意你依旧做1个好孙女,用美好的肉眼看世界,用善良的心宽容待人,用温暖的爱寻觅你的另四分之二精灵,要相信世间的一切都是美好的,包罗还未到来的幸福!

ISonicImage * pImg = GetSonicUI()->CreateImage();
pImg->Load("C:\\1.png");
ISonicString * pStr = GetSonicUI()->CreateString();
pStr->Format("/c=%x/你好吗,朋友/p=%d, a='http://hi.csdn.net/zskof'/", #0000ff, pImg->GetObjectId());

伍分钟左右,努尔娜古丽穿好黑灰衬衫下来了。她脖子上围了一条阿迪达斯品牌的反革命围巾,手上拿着一条耐克围巾。为何自己驾驭围巾的品牌?因为在围巾整个下沿绣着商标字母(“ADIDAS”和“NIKE”),纵然戴着镜子纠注引力也唯有伍.0的自家隔着几米远就专注到了。

   女男士的爱意一样令人充满梦想!

这么就能够像写网页一样在您的分界面上海展览中心开文字和图片的老婆当军排版输出了。

“给您的。”努尔娜古丽把耐克围巾挂子我脖子上。为了同盟他,小编有个别寒了弹指间腰。

(´-ωก`)晚安,环球的甜蜜人!

三.自绘开关
自绘按键大概是UI编写中最常见也是重复度最高的行事,平常是一连自CButton然后ownerdraw出来。小编的兑现是不采取窗体的纯自绘。其实超链接也得以知道为开关的一种,所以小编自绘开关的选择方法跟超链接也差不离。

“啊。谢谢。很意外。为什么?”

void WINAPI OnMove(ISonicString * pStr, LPVOID)
{
 g_pEffect->MoveGently(0, 0);
}

// 加载三态图片资源
ISonicImage * pImgNormal = GetSonicUI()->CreateImage();
pImgNormal->Load(BMP_NORMAL);
pImgNormal->SetColorKey(#ff00ff);

ISonicImage * pImgHover = GetSonicUI()->CreateImage();
pImgHover->Load(BMP_HOVER);
pImgHover->SetColorKey(#ff00ff);

ISonicImage * pImgClick = GetSonicUI()->CreateImage();
pImgClick->Load(BMP_CLICK);
pImgClick->SetColorKey(#ff00ff);

// ISonicString * g_pTest[10]
g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动'/", pImgNormal->GetObjectId(), pImgHover->GetObjectId(), 
 pImgClick->GetObjectId());
g_pTest[10]->Delegate(DELEGATE_EVENT_CLICK, NULL, NULL, OnMove);

“笔者首先次送礼物给人。因为明天夜间是本世纪末最终壹天,也因为笔者不想有遗憾。所以,作者有话就直言了。”努尔娜古丽努力做出抚媚壹笑的典型,尽力把眼睛笑成弯弯的明亮的月。她的笑用力过度,明显是为着幸免前面有望出现的难堪恐怕相当慢活而提早预付的情愫支票。

同样的,格式化好后的ISonicString在OnPaint的时候输出就能够,那样你就持有七个颇具3态转变的脍炙人口按键,个中’p’关键字表示
normal态,’ph’代表hover态,’pc’代表click态。假如从摄影那里得到的源图是一张图纸叁态平铺的也没什么,只须求将ph,pc都指
向同一张img就可以,内部会活动进行源区域裁剪。此外用过QQ2010的人恐怕会意识,二〇一〇的数不清开关三态转变是潜移默化的,体验很
好,ISonicString同样能够做,只需求格式化时稍稍修改一下,

“你说吧。”

g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动', animation=40/", pImgNormal->GetObjectId(), 
 pImgHover->GetObjectId(), pImgClick->GetObjectId());

“你记不记得大家通电话约好平安夜会见包车型地铁事情?”

追加多少个’animation=40’的调整符(40是渐变速度),就足以博得一个QQ200九一致美好的三态渐变开关了。开关的点击响应是
用“委托”的艺术,你须要向开关委托3个形如void WINAPI Func(ISonicBase *,
LPVOID)的大局函数或类的分子函数,以供引擎在按键被点击时回调。
公海赌船网站 1
图1:自绘按键

“记得。大致三个月前吧。”

四.脏管理与区域刷新
咱俩都了解gdi的绘图功效是不高的,无法像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了有的刷新的参数,而
局地刷新也是gdi下开始展览优化的关键所在。可在实操中,我不常看见有人做这样精细的切割,都以二个InvalidateRect(hwnd,
NULL,
TRUE)了事。那也难怪,笔者不管TextOut多个字符串,小编1旦要去关切它攻陷了略微区域,区域之内的交叉裁剪等等,未免就太繁琐了。所以笔者的内燃机提
供了三个ISonicPaint对象,意如其名,便是1块画布。创设那块画布时,你可以钦命其抱有协和的memDC,而鉴于节省gdi对象的考虑,你也可以钦赐其是壹块无memDC的画布,如何挑选依照真实情况。
始建三个画布

“对。至少七个月。至少三个月你没找我。”

ISonicPaint * pPaint = GetSonicUI()->CreatePaint();
pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);

“咱们约好平安夜会合。在那在此之前自身从不充裕理由去找你。”笔者稍稍发愣,不懂他为什么介意。

画布成立之后,只需求在WM_PAINT中调用画面包车型大巴Draw方法就能够,很简单。
固然您想在那些画布上做画,就供给像自绘开关同样,向画布委托两个您本人的绘图进程,以便在每回重绘时调用。示例代码如下:

“那天上午,大家通了电话。电话里,你说咱俩约会呢,笔者说好。笔者记得你说,和本人约会是一件很有含义的作业。你是如此说的啊?”努尔娜古丽语气咄咄逼人,完全未有了经常的温柔。

class CTest
{
public:
   void RenderImage(ISonicPaint * pPaint, LPVOID);
};

void CTest::RenderImage(ISonicPaint * pPaint, LPVOID)
{
    if(pPaint->GetCurrentPaint() == NULL)
   {
      return;
    }
  HDC hdc = pPaint->GetCurrentPaint()->hdc;
    int x = pPaint->GetCurrentPaint()->x;
    int y = pPaint->GetCurrentPaint()->y;
    // draw here
   ...
}

CTest test;
pPaint->Delegate(DELEGATE_EVENT_PAINT, NULL, &test, CSonicString::RenderImage);

本人有点吓住了,呃了两声,才蹦出话:“是,是。可自身守约在平安夜找你了哟”

那样每回只须要调用pPaint->Redraw()便会进展画布的区域重绘。那里须求验证的是,ISonicString,包罗接下去要介绍的多少个目的都以依靠画布的,也正是说引擎的享有目标都以怀有脏管理检查和区域自绘制优化的,能够相当的大的加强运转功效。
除了这么些之外委托绘制以外,你还是能向画布上一贯增添UI对象,画布帮助的目的有:ISonicImage,
ISonicString, ISonicPaint

“不许说话。笔者话说完以前您不开口!”努尔娜古丽用左手食指指着作者。

五.异形窗体(包含像素级透明异形窗体)
异形窗体也是UI特效中平时必要使用的才能,常见的有两种落成方式。1种艺术是基于图片裁剪出2个rgn,然后调用SetWindow兰德ENVISIONgn,另三个措施
是将窗体设为WS_EX_LAYERED属性,调用SetLayeredWindowAttributes或UpdateLayeredWindow实现透明裁剪。前壹种艺术成效相当的低,而且拖动窗体时会出现难看的残影,后一种方式展现功效越来越好,拖动时能够幸免残影出现,但无法成效于WS_CHILD属性的
窗体。贰者各有上下。SonicUI同时提供了那三种完毕格局,能够依照气象选用。
方法1:

“你让自身说的。”作者咕哝了一句。

...
// ISonicImage * pImg
SetWindowRgn(hWnd, pImg->CreateRgn());

“闭嘴!”她直接用耐克围巾堵作者的嘴,过了好壹会才推广,满脸通红。

方法2:

“你还说自家是惟一的。你对本身说这么密切的话,而自个儿应了你,满面春风地应了你。你感到那是什么?在我观念里,那正是1种亲密关系的订立。小编不掌握您那几个西边人是怎么看待的,反正寻常北方人都会像自家那样感觉。笔者怀着欣喜地在之后等着你来找小编。而你从未。你冷淡到贰个电话都尚未。笔者都并未有信心你是还是不是真正和本人说过那多少个话。”努尔娜古丽眼眶有个别发红,吸了吸鼻子。

...
// ISonicImage * pImg
// ISonicWndEffect * pEffect
pEffect->Attach(hWnd, TRUE);    // 使用像素级alpha模式attach
pEffect->SetShapeByImage(pImg);

公海赌船网站,本身上手捂住嘴巴,右手举手,暗指想要说话。

公海赌船网站 2
图二:异形窗体效果图
值得1提的是,要是选取UpdateLayeredWindow做窗体的像素级阿尔法特效,文字输出就改成了二个劳动,因为gdi的文字输出函数是不
带alpha通道的,直接TextOut上去不能够平常表现。可是ISonicString可以帮您消除那壹难点,作者在其间已经为文字扩大了阿尔法通
道,能够很好的适应背景。

“你说。”

结语:引擎中还有滚动字幕组件,动画组件等常用的UI表现组件,限于篇幅就不1一介绍了,请大家参考ISonicUI.h中的表达自身试用。设计这些引
擎时的焦点规则正是便利,高效,假诺大家在利用进度中有怎么着好的建议或须求,也有请联系自个儿,帮忙自个儿完善那么些引擎。因为引擎完整兑当代码有数万行,而且今后还属于企财,就暂不公布完全源码了,但对一些工夫实现细节有意思味的仇人,能够与本人关系,共同学习提升。
QQ:20346020

“不佳意思。笔者是自卑。就算获得你的回复之后,作者也没把握事实确实爆发了。所以,胆战心惊等到平安夜。”

E_mail:zs_kof@163.com 

“哼。”努尔娜古丽乜斜着双眼。


“我想找你,找不到理由。”作者真切说。

其它UI软件

“你去圣多明各找女子高校友就有理由。是的,确实有理由。”努尔娜古丽似笑非笑看着本人。

http://topic.csdn.net/u/20100306/00/ad4496f4-7d82-459b-b523-e18b42675580.html 

她怎么知道的?颜芐告诉她的啊。小编后背渗出汗。本来是一件十分小的专门的职业,但见努尔娜古丽如此介意,事情就像严重了相似。情感一旦付出正是这般,1颗心会变得很聪明伶俐、很上心对方怎么对待本人。一丝丝的忽视大概怠慢,在亲密关系缔结个中恐怕会放大成原则难点。

SkinSE(全称:skin so easy)

自家真的紧张,脑子飞速旋转寻觅贰个体面的答案。那一刻,小编驾驭了和煦的心意:小编实在在意努尔娜古丽的感受。

文书档案也很全。

唯恐笔者该说出借口和理由,作者从不。实话实话和放低姿态只怕是此时的最佳选拔。“古丽,不佳意思。”

 

自己的抉择是对的。努尔娜古丽笑了。作者也笑了。原来幸免争吵是如此总结,一句道歉就够了。在那一点上,梁夏不及作者。

SkinSB

本身回想了梁夏,笑容僵硬了。尽管梁夏大概不介意,但小编要好真切介意。

http://topic.csdn.net/u/20100127/12/491a7a32-9231-4227-bc33-fb9a2f629457.html

努尔娜古丽嗅出了自家的情怀变化,呼了一口白气说:“给您讲个传说。大和尚被妙龄女孩子过河,过往河后大和尚告别了半边天。随行的小和尚向来耿耿于大和尚犯了戒,不断叹气。大和尚说,小编都放下了,你怎么还放不下?”

http://www.skinse.com/update.html 

“什么看头?”作者问。

 

“小编都放下了?你怎么还放不下?”努尔娜古丽补充道。

Codejock Xtreme Toolkit

在一楼候客厅面对面站着对话的趋之若鹜自个儿和他,还有两对仇敌也在楠楠私语。恐怕,在外人眼里,作者和努尔娜古丽已是情侣,只可是笔者不够确信罢了。

VS 2008 Feature Pack

http://blog.csdn.net/barech/archive/2009/07/02/4315157.aspx 

 

 

对呀,连女方都放下了,小编一个大女婿又何以放不下的。作者暮然释怀,说:“古丽,笔者不领会今后什么。但自己驾驭,小编很期待和你在一块儿。”

努尔娜古丽凑到自己身边,挽住自个儿的单臂,“那行。那未来带笔者去哪?”(未完待续)

从头读点击那里

开卷《左手的温度》其他章节点击那里

相关文章