| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6359 人关注过本帖
标题:All about windows programming
取消只看楼主 加入收藏
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

这次来谈鼠标的应用,Windows 中通过光标来指示当前鼠标的位置, 在Windows操作系统中预定义了几种光标:

IDC_HAND 手型光标 IDC_ARROW 箭头光标 IDC_CROSS 十字光标 IDC_HELP 带有箭头和问号的光标 IDC_IBEAB I 型文本光标 IDC_ICON 空图标 IDC_SIZEALL 四个方向都有箭头的光标 IDC_SIZENESW 带有指向东北方和西南方箭头的光标 IDC_SIZENS 带有指向北方和南方的光标 IDC_SIZENWSE 带有指向西北方和东南方箭头的光标 IDC_SIZEWE 带有指向东方和西方箭头的光标 IDC_UPARROW 垂直箭头光标 IDC_WAIT 计时光标(沙漏光标)

用户也可以通过图形编辑器自定义光标形式,将其保存在扩展名为 .cur 的文件中,采用自定义光标时,需要在资源文件中定义光标资源,其形式为: 光标名 CURSOR 光标文件(.cur) 然后应用程序通过调用 LoadCursor 加载光标资源,其形式为:LoadCursor(hThisInst, lpszCursorname) 其中, hThisInst 为应用程序当前实例handle, lpszCursorname 为当前光标,应用程序加载光标资源常在定义窗口类时进行,例如,

WNDCLASS wndclass;

...

wndclass.hCursor = LoadCursor(hThisInst, IDC_SIZEALL);

...

此外,还可在应用程序中调用 LoadCursor 函数改变光标形式。

// next time continue


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-19 06:24
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

Windows操作系统通过鼠标 设备驱动程序 接受鼠标输入 。鼠标驱动程序在启动Windows时装入,Windows操作系统通过鼠标驱动程序能监测出鼠标是否存在。如果鼠标已经存在,则设备驱动程序将注意到Windows的任何鼠标事件。每当在窗口内有鼠标事件发生时,窗口就接受到一个鼠标事件(以消息的形式发送给应用程序的窗口)。

当应用程序的用户区内产生一个鼠标事件时,就将产生一个用户区鼠标消息。用户区常用的鼠标消息:

WM_LBUTTONDOWN 用户区内按下鼠标左键

WM_LBUTTONUP 用户区内松开鼠标左键

WM_LBUTTONDBLCLK 用户区内双击鼠标左键

WM_RBUTTONUP 用户区内松开鼠标右键

WM_RBUTTONDBLCLK 用户区内双击鼠标右键

WM_MOUSEMOVE 鼠标在用户区内移动

在鼠标消息中,通过用户区消息的 lParam 和 wParam 参数,程序员就可以确定鼠标的位置和鼠标键的状态。参数lParam 包含了以窗口的左上角为原点的坐标系鼠标位置,其低位包含了鼠标位置的 X 坐标值,高位包含了鼠标位置的 Y 坐标;参数wParam包含了一个指示各种虚键状态的值。wParam 参数是下表所列值的组合。

值 含义

MK_CONTROL 按下键盘上的Ctrl 键

MK_LBUTTON 按了鼠标左键,等同于WMO_LBUTTONDOWN

MK_RBUTTON 按了鼠标右键,等同于WMO_RBUTTONDOWN

MK_SHIFT 按下键盘上的Shift 键

当按下鼠标左键时同时监测 Shift 键和 Ctrl 键,一般用如下代码:

case WM_LBUTTONDOWN: // 按下鼠标左键

if((wParam & MK_CONTROL) && (wParam & MK_SHIFT)) // Shift 和Ctrl 键都被按下

...

break;

case WM_LBUTTONUP: // 释放鼠标左键

...

break;

....

对于鼠标双击,一般设定的双击时间间隔为0.5s, 这是Windows系统默认的时间间隔,当然,应用程序也可以调用 SetDoubleClickTime() 函数来重新设定此值,此外,若要使窗口函数能接受鼠标双击产生的消息,则在注册窗口类时必须注明窗口类具有 CS_DBLCLKS 属性,定义方式如下:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

若窗口不包含上述属性的定义,那么即使进行了双击操作,该窗口也只能接受到两条单击消息。

每当在一个窗口的用户区以外的地方(例如在窗口的菜单,滚动条,工具条和标题条等处)产生了一个鼠标事件,就将产生一个非用户区鼠标消息,对于非用户区鼠标消息,往往不由应用程序进行具体处理,而是送往 DefWindowProc 函数进行处理。

通常情况下,只有当鼠标光标位于某一窗口的用户区时,该窗口的窗口函数才能接受到鼠标消息,但是由于鼠标移动的随机性,难以保证光标始终不离开某一个窗口,如果要使某一个窗口能不间断地捕获鼠标消息,就必须对鼠标加以捕获,此时可以调用 SetCapture() 函数实现对鼠标的捕获,如 SetCapture(hWnd); 这样可以使Windows发送的所有鼠标消息均定向到某一个窗口,而不管鼠标的光标处于何处。

一旦从窗口捕获了鼠标,系统的键盘功能就暂时失效,其他窗口也无法得到鼠标消息,因此,当该窗口不再需要捕获所有的鼠标消息时,应及时调用 ReleaseCapture() 函数释放鼠标,以便其他窗口可以正常地接受鼠标消息。

// Code next time, continue


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-24 00:50
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

#include <windows.h> #include <stdio.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName [] = "Windows"; char lpszTitle [] = "Windows Key Demo"; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = lpszClassName; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&wndclass)) { return 0; }

hwnd = CreateWindow(lpszClassName, lpszTitle, WS_SYSMENU, // 应用程序可以被关闭,通过点击大叉 50, 50, 450, 450, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; HBRUSH hbrush; HPEN hpen; HCURSOR hcursor; char str[15]; static int x, y;

switch(message) { case WM_MOUSEMOVE: x = LOWORD(lParam); y = HIWORD(lParam); if(x>50 && x<150 && y>50 && y<150) //设置十字光标显示区域 { hcursor = LoadCursor(NULL, IDC_CROSS); //装载十字光标 SetCursor(hcursor); } if(x>150 && x<250 && y>50 && y<150) { hcursor = LoadCursor(NULL, IDC_SIZEALL); SetCursor(hcursor); } if(x>250 && x<350 && y>50 && y<150) { hcursor = LoadCursor(NULL, IDC_SIZENESW); SetCursor(hcursor); } if(x>50 && x<150 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_IBEAM); SetCursor(hcursor); } if(x>150 && x<250 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_WAIT); SetCursor(hcursor); } if(x>250 && x<350 && y>150 && y<250) { hcursor = LoadCursor(NULL, IDC_UPARROW); SetCursor(hcursor); } if(x>50 && x<150 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZEWE); SetCursor(hcursor); } if(x>150 && x<250 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZENWSE); SetCursor(hcursor); } if(x>250 && x<350 && y>250 && y<350) { hcursor = LoadCursor(NULL, IDC_SIZENS); SetCursor(hcursor); } if(x>350 || y>350) { hcursor = LoadCursor(NULL, IDC_HELP); SetCursor(hcursor); } if(x<50 || y<50) { hcursor = LoadCursor(NULL, IDC_APPSTARTING); SetCursor(hcursor); } hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm); hbrush = (HBRUSH)GetStockObject(WHITE_BRUSH); SelectObject(hdc, hbrush); hpen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc, hpen); Rectangle(hdc, 5, 5, tm.tmAveCharWidth*8, tm.tmHeight+3); sprintf(str, "%d, %d\0", x, y); TextOut(hdc, 5,5,str, lstrlen(str)); EndPaint(hwnd, &ps); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hpen = (HPEN)GetStockObject(BLACK_PEN); SelectObject(hdc, hpen); Rectangle(hdc, 50,50,350,350); MoveToEx(hdc, 50,150,NULL); LineTo(hdc, 350,150); MoveToEx(hdc, 50,250,NULL); LineTo(hdc, 350,250); MoveToEx(hdc, 150,50,NULL); LineTo(hdc, 150,350); MoveToEx(hdc, 250,50,NULL); LineTo(hdc, 250,350); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-26 03:40
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

出于两个原因,我对这个帖的工作进行地极其缓慢。原因之一,保持慢速度使大家能有兴趣跟着做。其实学编程需要投入极大的激情,极大的耐心和极大的毅力。并不是你一时高兴来做几个兴趣题,来显示你比较聪明。我已经不再做那种趣味题了,做趣味题只是为了让你熟悉一门编程语言而已,当你对一门编程语言已经掌握,应该考虑如何去做项目,如何去做有操作界面的应用程序。也就是说,应该从阶段1 过渡到阶段2 了。在C语言板块有很多朋友对C语言已经掌握,甚至掌握的很好,可还是一味地把精力投入在趣味题编程上。我认为这是一种错误,windows 编程不是一件简单的工作,同样需要时间和精力的投入。如果把时间投入到学习 windows 编程上,那么1-2 年后你将有能力做出你自己的应用程序,而把精力投入在 趣味题上,1-2 后,你还是做不出任何东西。

原因之二,自己本人有学习和工作的压力,所以也就不能经常来,为此投入的时间就少了,如果朋友们觉得这个帖的进展较慢的话,那请见谅。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-27 00:18
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

我们接下来要讨论是这么一个单词: 资源。在windows 编程中我们经常要听到这么一个单词,那就是资源。在编程中我们经常用到加速键,位图,对话框和菜单等对象,实际上,这些都是资源。这些资源可是使用VC6.0提供的资源编辑器来进行创建和编辑,也可以使用文本编译器进行编辑。资源是windows应用程序用户界面的重要组成部分。

下面我们来讲菜单与加速键资源

菜单实际上是一种资源,经常同加速键资源一同使用,使菜单操作更加方便。

菜单主要有窗口主菜单条,下拉式菜单框,菜单项热键标识,菜单项加速键标识和菜单项分隔线组成,此外,菜单项前常有选中标志以标识某菜单项是否被选中。

下面将通过以下4点,以及一个例程来讲解菜单资源。

1)菜单的创建过程

2)操作菜单项

3)动态创建菜单

4)加速键资源

具体讲解以上4点,下次继续。。。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-27 00:37
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

菜单的创建过程 - 分为定义和加载两个步骤。

1)定义菜单

菜单的定义格式由四部分组成:

a) 菜单名 - 用来标识特定的菜单,应用程序通过菜单名加载指定菜单;

b) MENU 关键字 - 用来标识资源的性质;

c) 载入特性选项 - 用以标识菜单所具有的载入特性,常用的载入特性选项及其说明如下表所示:

选项 说明

DISCARDABLE 当不再需要菜单时可丢弃

FIXED 将菜单保存在内存中的固定位置

LOADONCALL 需要时加载菜单

MOVEABLE 菜单在内存中可移动

PRELOAD 立即加载菜单

d) 菜单项列表 - 应用程序在资源描述文件中使用关键字 POPUP和MENUITEM定义菜单项。

菜单在资源描述文件中的定义形式为:

菜单名 MENU [, 载入特性选项]

{

菜单项列表

}

(1) POPUP语句 - 定义弹出式菜单,其形式为:

POPUP "菜单项名"[,选项];

程序员还可以在菜单项名中加入符号 "&", 以定义该菜单项的热键。 例如定义弹出式菜单项"编辑"的形式为:

POPUP "编辑(&E)"; 该菜单项使用 Alt+ E键作为热键。

菜单项常用选项及其说明:

选项 说明

MENUBARBREAK 菜单项纵向分隔标志

CHECKED 显示选中标志

INACTIVE 禁止一个菜单项

GRAYED 禁止一个菜单项,并使其变灰

POPUP 定义的弹出式菜单项还包含子菜单。

(2) MENUITEM 语句 - 用于定义菜单项,其形式为:MENUITEM "菜单项名"菜单项标识(ID)[,选项]

其中 ID 为菜单项标识,应用程序通过菜单项的标识值唯一地确认每一个菜单项的消息,菜单项标识可为 0 到 65535 之间的任意一个整数,他通常在应用程序头文件中定义。在WM_COMMAND 消息中系统发送给应用程序的菜单标识值,WM_COMMAND消息中字参数 wParam 包含了选中菜单项的标识。此外,如果需要创建菜单中的水平分隔符,可以利用下面的语句:MENUITEM SEPARATOR

例如,应用程序需要在其名为 "MyMenu" 的窗口菜单中创建一个 "编辑"弹出式菜单。该菜单含有名称为"剪切", "复制", "粘贴", "全选", "清除"及 "退出" 等菜单项。 要求应用程序运行时系统可根据需要调整该菜单在内存中的位置,以提高内存的利用率; 菜单项均使用热键; 并且 "退出" 项与其他菜单项之间用分隔线分开。该菜单在资源描述文件中的定义如下:

#include <windows.h>

#include "Menu.h"

// 菜单定义

MyMenu MENU MOVEABLE // MyMenu 为窗口菜单的名称

{

POPUP "编辑(&E)" // 定义"编辑" 弹出式菜单

{

MENUITEM "剪切( &X)", IDM_CUT

MENUITEM "剪切( &X)", IDM_CUT

MENUITEM "复制( &C)", IDM_COPY

MENUITEM "粘贴( &V)", IDM_PASTE

MENUITEM "全选( &L)", IDM_SELECTALL

MENUITEM "清除( &X)", IDM_CLEAR

MENUITEM SEPARATOR // 分隔线

MENUITEM "退出( &X)", IDM_EXIT

}

}

Menu.h 文件中定义了菜单项标识所对应的数值:

。。。

#define IDM_CUT 20

#define IDM_COPY 21

#define IDM_PASTE 22

#define IDM_SELECTALL 23

#define IDM_CLEAR 24

#define IDM_EXIT 25

// to be continued


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-29 23:33
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

2) 加载菜单资源

在 windows 应用程序中加载菜单的方法有如下3种:

(1)在窗口类中加载菜单 - 通过下列语句实现:

.......

WNDCLASS wndclass;

......

wndclass.lpszMenuName = lpszMenuName;

......

应用程序在窗口类中加载菜单后,该类窗口将使用此菜单作为默认菜单。

(2)在创建窗口时加载菜单

应用程序也可在调用函数 CreateWindow 创建窗口时加载窗口菜单。这时,应用程序需首先调用函数 LoadMenu 加载菜单。该函数的原型为: HMENU LoadMenu( hInstance, lpszMenuName)

其中 hInstance 为当前程序的实例handle, lpsyMenuName 为窗口菜单名

例如,应用程序希望在创建的窗口中加载名称为 MyMenu 的窗口菜单,其形式为:

HWND hwnd, hmenu;

...

hmenu = LoadMenu(hInstance, "MyMenu");

hwnd = CreateWindow(...,...,...,...,...,...,...,...,hmenu,...,...);

如果创建的窗口希望使用所属窗口类的默认菜单,则应设置函数 CreateWindow 的菜单handle 参数为NULL。

(3) 动态加载菜单

应用程序调用函数 LoadMenu 获取菜单handle 后,还可通过调用函数 SetMenu 动态地加载菜单,以提高应用程序的灵活性。该函数的原型为: BOOL SetMenu (HWND hwnd, HMENU hmenu) // hwnd 为窗口handle, hmenu 为菜单handle

动态加载菜单可在同一个应用程序中实现多种不同的菜单操作界面。 例如应用程序定义了两种菜单 Menu1 和 Menu2 及相应的两套菜单项,通过调用函数 SetMenu 在两个菜单之间切换,该应用程序可实现两种界面的操作及相应的菜单项功能,程序段如下:

HMENU hmenu1, hmenu2<

...

hmenu1 = LoadMenu(hInstance, "Menu1"); // 使用Menu1 为窗口初始菜单

hwnd = CreateWindow(...,...,...,...,...,...,...,..., hmenu1, ...,...);

...

hmenu2 = LoadMenu(hInstance, "Menu2"); // 将窗口菜单切换为 Menu2

SetMenu(hwnd, hmenu2);

...

// to be continued, 下次来讲对菜单项的操作。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-30 00:01
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

给大家上传一个小的应用程序,我暂时将我未来的公司命名为 kaisoft ,

当然,应用程序的 icon 用了 KAI 这个图标。

这是一个简单的看图应用程序。以后逐渐改进。

[attach]888[/attach]

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-09-30 00:30
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

22 楼,我编辑了几次都不行,干脆改为上传文件了。

前面的讲解以及讲解程序并非我的原创,摘录于各种书籍。如 Petzold 的 windows programming

windows programming 我是从两年前开始学的,上来的时候确实是举步艰难,很多专用名词不解,那么就看 MSDN ,并且自己写在本子上,慢慢积累,时间久了,就觉得那些词是理所当然的了。其实如果我将所有的细节写清楚,那就得一本书了。并且未必所有人会去看。当一样东西完完整整的放在你面前时,你的兴趣反而会高不起来的。所以我希望采取讨论的方式。我给个大概,一定附有例程,大家对不清楚的概念提出来,再来讨论。

至于那个上传的看图小程序,完全是我个人原创。

那个 exit 确实代码没写对,我忽略了。通常我是不点击 exit ,而是直接点击右上角的那个大叉,所以一直没有发现那个问题。谢谢 live41 的指出。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-03 16:37
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

接着32楼,继续来讲对菜单项的操作

创建菜单后,程序可调用相关函数对菜单项进行操作,如禁止或激活菜单项,设置或取消选中标志,增加菜单项,删除菜单项,修改菜单项。

我们先来讲禁止或激活菜单项:(两种方式)

方法1。通过在资源描述文件中设定菜单项的选项以指定该菜单项的初始状态为禁止或激活

或方法2。调用函数 DWORD EnableMenuItem(HMENU hmenu, UINT wIDEnableItem, UINT dwEnable) 来改变其初始状态。

hmenu 为菜单handle ( 请注意,我对handle 不做翻译,中文书上会将这个词翻译为句柄,什么乱七八糟的,句子还有把柄吗?这个最初的对这个单词的蹩脚的翻译,使得理解上更为困难。我对当初将这个单词翻译为句柄的人表示严重抗议!!! 请大家将 handle 理解为操作识别符 )

wIDEnableItem 为 被禁止或激活的菜单项标识, dwEnable 为 菜单项操作标识的取值, 可能为该菜单项的 ID 数值, 也可能为该菜单项在菜单中的位置,

dwEnable 参数的常用标识及其说明:

MF_BYCOMMAND 表明以ID 来标识菜单项 MF_BYPOSITION 表明以位置来标识菜单项 MF_DISABLED 表明禁止菜单项 MF_ENABLED 表明激活菜单项 MF_GRAYED 表明禁止菜单项,并使其变灰

举例来讲, 禁止弹出式菜单 "编辑"中的"复制"项的形式如下:

EnableMenuItem(hmenu, IDM_COPY, MF_BYCOMMAND | MF_DISABLED );

// 其余4种操作,下次继续


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-03 17:17
快速回复:All about windows programming
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071888 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved