给pjblog上面移植自己的ubb功能成功

给pjblog上面移植自己的ubb功能成功

自己本机的blog上面有自己写的grid功能和codehilight代码高亮,在外面的这个pjblog上没有,就觉得用着很不顺。

今天抽空打算移植下,顺便就翻了下pj的代码。
却意外地发现和我本机的那个旧blog结构惊人地相似,很多地方代码几乎完全一样。于是移植这些功能完全不费吹灰之力,copy几次代码就完了。
也在怀疑是否pj和这个旧blog同根同源。

grid功能测试:
ABCD
1        
2        
3        



windows getLastError return value:
0 操作成功完成。
1 功能错误。
2 系统找不到指定的文件。
3 系统找不到指定的路径。
4 系统无法打开文件。
5 拒绝访问。
6 句柄无效。
7 存储控制块被损坏。
8 存储空间不足,无法处理此命令。
9 存储控制块地址无效。
10 环境错误。
11 试图加载格式错误的程序。
12 访问码无效。
13 数据无效。
14 存储器不足,无法完成此操作。
15 系统找不到指定的驱动器。
16 无法删除目录。
17 系统无法将文件移到不同的驱动器。
18 没有更多文件。
19 介质受写入保护。
20 系统找不到指定的设备。
21 设备未就绪。
22 设备不识别此命令。
23 数据错误 (循环冗余检查)。
24 程序发出命令,但命令长度不正确。
25 驱动器无法找出磁盘上特定区域或磁道的位置。
26 无法访问指定的磁盘或软盘。
27 驱动器找不到请求的扇区。
28 打印机缺纸。
29 系统无法写入指定的设备。
30 系统无法从指定的设备上读取。
31 连到系统上的设备没有发挥作用。
32 进程无法访问文件,因为另一个程序正在使用此文件。
33 进程无法访问文件,因为另一个程序已锁定文件的一部分。
36 用来共享的打开文件过多。
38 到达文件结尾。
39 磁盘已满。
50 不支持网络请求。
51 远程计算机不可用 。
52 在网络上已有重复的名称。
53 找不到网络路径。
54 网络忙。
55 指定的网络资源或设备不再可用。
56 已到达网络 BIOS 命令限制。
57 网络适配器硬件出错。
58 指定的服务器无法运行请求的操作。
59 发生意外的网络错误。
60 远程适配器不兼容。
61 打印机队列已满。
62 无法在服务器上获得用于保存待打印文件的空间。
63 删除等候打印的文件。
64 指定的网络名不再可用。
65 拒绝网络访问。
66 网络资源类型错误。
67 找不到网络名。
68 超过本地计算机网卡的名称限制。
69 超出网络 BIOS 会话限制。
70 远程服务器已暂停,或正在启动过程中。
71 当前已无法再同此远程计算机连接,因为已达到计算机的连接数目极限。
72 已暂停指定的打印机或磁盘设备。
80 文件存在。
82 无法创建目录或文件。
83 INT 24 失败。
84 无法取得处理此请求的存储空间。
85 本地设备名已在使用中。
86 指定的网络密码错误。
87 参数错误。
88 网络上发生写入错误。
89 系统无法在此时启动另一个进程。
100 无法创建另一个系统信号灯。
101 另一个进程拥有独占的信号灯。
102 已设置信号灯且无法关闭。
103 无法再设置信号灯。
104 无法在中断时请求独占的信号灯。
105 此信号灯的前一个所有权已结束。
107 程序停止,因为替代的软盘未插入。
108 磁盘在使用中,或被另一个进程锁定。
109 管道已结束。
110 系统无法打开指定的设备或文件。
111 文件名太长。
112 磁盘空间不足。
113 无法再获得内部文件的标识。
114 目标内部文件的标识不正确。
117 应用程序制作的 IOCTL 调用错误。
118 验证写入的切换参数值错误。
119 系统不支持请求的命令。
120 此功能只被此系统支持。
121 信号灯超时时间已到。
122 传递到系统调用的数据区太小。
123 文件名、目录名或卷标语法不正确。
124 系统调用级别错误。
125 磁盘没有卷标。
126 找不到指定的模块。
127 找不到指定的程序。
128 没有等候的子进程。
130 试图使用操作(而非原始磁盘 I/O)的已打开磁盘分区的文件句柄。
131 试图移动文件指针到文件开头之前。
132 无法在指定的设备或文件上设置文件指针。
133 包含先前加入驱动器的驱动器无法使用 JOIN 或 SUBST 命令。
134 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
135 试图在已被合并的驱动器上使用 JOIN 或 SUBST 命令。
136 系统试图解除未合并驱动器的 JOIN。
137 系统试图解除未替代驱动器的 SUBST。
138 系统试图将驱动器合并到合并驱动器上的目录。
139 系统试图将驱动器替代为替代驱动器上的目录。
140 系统试图将驱动器合并到替代驱动器上的目录。
141 系统试图替代驱动器为合并驱动器上的目录。
142 系统无法在此时运行 JOIN 或 SUBST。
143 系统无法将驱动器合并到或替代为相同驱动器上的目录。
144 目录并非根目录下的子目录。
145 目录非空。
146 指定的路径已在替代中使用。
147 资源不足,无法处理此命令。
148 指定的路径无法在此时使用。
149 企图将驱动器合并或替代为驱动器上目录是上一个替代的目标的驱动器。
150 系统跟踪信息未在 CONFIG.SYS 文件中指定,或不允许跟踪。
151 为 DosMuxSemWait 指定的信号灯事件个数错误。
152 DosMuxSemWait 不可运行。已设置过多的信号灯。
153 DosMuxSemWait 清单错误。
154 输入的卷标超过目标文件系统的长度限制
155 无法创建另一个线程。
156 接收进程已拒绝此信号。
157 段已被放弃且无法锁定。
158 段已解除锁定。
159 线程标识的地址错误。
160 传递到 DosExecPgm 的参数字符串错误。
161 指定的路径无效。
162 信号已暂停。
164 无法在系统中创建更多的线程。
167 无法锁定文件区域。
170 请求的资源在使用中。
173 对于提供取消区域进行锁定的请求不明显。
174 文件系统不支持锁定类型的最小单元更改。
180 系统检测出错误的段号。
183 当文件已存在时,无法创建该文件。
186 传递的标志错误。
187 找不到指定的系统信号灯名称。
196 操作系统无法运行此应用程序。
197 操作系统当前的配置不能运行此应用程序。
199 操作系统无法运行此应用程序。
200 代码段不可大于或等于 64K。
203 操作系统找不到已输入的环境选项。
205 命令子树中的进程没有信号处理程序。
206 文件名或扩展名太长。
207 第 2 环堆栈已被占用。
208 没有正确输入文件名通配符 * 或 ?,或指定过多的文件名通配符。
209 正在发送的信号错误。
210 无法设置信号处理程序。
212 段已锁定且无法重新分配。
214 连到该程序或动态链接模块的动态链接模块太多。
215 无法嵌套调用 LoadModule。
230 管道状态无效。
231 所有的管道实例都在使用中。
232 管道正在关闭中。
233 管道的另一端上无任何进程。
234 更多数据可用。
240 取消会话。
254 指定的扩展属性名无效。
255 扩展属性不一致。
258 等待的操作过时。
259 没有可用的数据了。
266 无法使用复制功能。
267 目录名无效。
275 扩展属性在缓冲区中不适用。
276 装在文件系统上的扩展属性文件已损坏。
277 扩展属性表格文件已满。
278 指定的扩展属性句柄无效。
282 装入的文件系统不支持扩展属性。
288 企图释放并非呼叫方所拥有的多用户终端运行程序。
298 发向信号灯的请求过多。
299 仅完成部分的 ReadProcessMemoty 或 WriteProcessMemory 请求。
300 操作锁定请求被拒绝。
301 系统接收了一个无效的操作锁定确认。
487 试图访问无效的地址。
534 算术结果超过 32 位。
535 管道的另一端有一进程。
536 等候打开管道另一端的进程。
994 拒绝访问扩展属性。


codehilight功能测试:
C++ 代码:
//我写的一个WM上简单的DX类的截取
#include "StdAfx.h"
#include "DXGraphics.h"
#include "MobileDXDemo1.h"

extern CMobileDXDemo1App theApp;

template<typename T1>
void inline StructInit(T1& st1)
{
    ::ZeroMemory(&st1,sizeof(T1));
    st1.dwSize = sizeof(T1);
}

HRESULT CreateDDSurfaceFromBitmap(IDirectDraw* DDraw1, IDirectDrawSurface* & pdds, HBITMAP hbm, int x, int y,
             int dx, int dy)
{
    HDC hdcImage;
    HDC hdc;
    BITMAP bm;
    //DDSURFACEDESC ddsd;
    HRESULT hr;

    if (hbm == NULL )
    {
        //LOGOUT3(4,_T("INVALID para"));
        return E_FAIL;
    }

    //
    // Select bitmap into a memoryDC so we can use it.
    //
    hdcImage = CreateCompatibleDC(NULL);
    if (!hdcImage) {
        OutputDebugString(TEXT("DDHEL: CreateCompatibleDC failed.\n"));
        //LOGOUT3(5,_T("DDHEL: CreateCompatibleDC failed.\n"));
        return E_FAIL;
    }
    SelectObject(hdcImage, hbm);

    //
    // Get size of the bitmap
    //
    GetObject(hbm, sizeof(bm), &bm);
    dx = dx == 0 ? bm.bmWidth : dx;    // Use the passed size, unless zero
    dy = dy == 0 ? bm.bmHeight : dy;


    DDSURFACEDESC ddsd1;
    StructInit(ddsd1);
    ddsd1.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; /*| DDSD_PIXELFORMAT;*/
    ddsd1.dwHeight = dy;
    ddsd1.dwWidth = dx;
    //StructInit((ddsd2.ddpfPixelFormat));
    //ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB;
    //ddsd2.ddpfPixelFormat.dwRGBBitCount = 24;

    HRESULT hr1 = DDraw1->CreateSurface(&ddsd1,&pdds,NULL);
    if(hr1 != DD_OK)
    {
        //LOGOUT3(hr1,_T("Cannot create surface!"));
        return hr1;
    }

    DDPIXELFORMAT ddpf;

    if (SUCCEEDED(pdds->GetPixelFormat(&ddpf)))
    {
        TCHAR str1[256];
        _stprintf(str1,_T("Pf RGBcount:%d R:%x G:%x B:%x\n"),ddpf.dwRGBBitCount,ddpf.dwRBitMask,ddpf.dwGBitMask,ddpf.dwBBitMask);
        ::OutputDebugString(str1);
    }

    if ((hr = pdds->GetDC(&hdc)) == DD_OK)
    {
        if (!StretchBlt(hdc,
            0, 0,
            ddsd1.dwWidth,
            ddsd1.dwHeight,
            hdcImage,
            x, y,
            dx, dy,
            SRCCOPY)) hr = E_FAIL;
        pdds->ReleaseDC(hdc);
    }
    DeleteDC(hdcImage);
    return hr;
}


CDXGraphics::CDXGraphics(void)
{
    backDC = 0;
}

CDXGraphics::~CDXGraphics(void)
{
}

bool CDXGraphics::Init(int W,int H,HWND Hwnd)
{
    this->scnW = W;
    this->scnH = H;
    this->theHwnd = Hwnd;

    HRESULT hr1 = DirectDrawCreate(NULL, &DDraw1, NULL);
    if(hr1 != DD_OK)
    {
        return false;
    }
    hr1 = DDraw1->SetCooperativeLevel (this->theHwnd,DDSCL_NORMAL );
    if(hr1 !=DD_OK)
    {
        return false;
    }

    ::DDSURFACEDESC ddsd1;
    StructInit(ddsd1);
    ddsd1.dwFlags = DDSD_CAPS ;
    ddsd1.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ;

    hr1 = DDraw1->CreateSurface (&ddsd1,&DPrim1,NULL);
    if(hr1 != DD_OK)
    {
        return false;
    }

    DDSURFACEDESC ddsd2;
    StructInit(ddsd2);
    ddsd2.dwFlags =  DDSD_HEIGHT | DDSD_WIDTH/* | DDSD_PIXELFORMAT*/ ;
    ddsd2.dwHeight = scnH;
    ddsd2.dwWidth = scnW;
    /*StructInit((ddsd2.ddpfPixelFormat));
    ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB;
    ddsd2.ddpfPixelFormat.dwRGBBitCount = 24;
    ddsd2.ddpfPixelFormat.dwRBitMask = 0xff0000;
    ddsd2.ddpfPixelFormat.dwGBitMask = 0xff00;
    ddsd2.ddpfPixelFormat.dwBBitMask = 0xff; */


    hr1 = DDraw1->CreateSurface (&ddsd2, &DBack1,NULL);
    if(hr1 != DD_OK)
    {
        return false;
    }

    hr1 = DDraw1->CreateClipper(0,&DBackClipper1,NULL);
    if(hr1 != DD_OK)
    {
        return false;
    }
    HRGN hRgn1= CreateRectRgn(0,0,scnW,scnH);
    BYTE buf[256];
    LPRGNDATA pRgn1 =(LPRGNDATA) buf;
    GetRegionData(hRgn1,sizeof(buf),pRgn1);
    hr1 = DBackClipper1->SetClipList(pRgn1,0);
    DeleteObject(hRgn1);
    if(hr1 != DD_OK)
    {
        return false;
    }
    hr1 = DBack1->SetClipper(DBackClipper1);
    if(hr1 != DD_OK)
    {
        return false;
    }
    
    return true;
}

bool CDXGraphics::Refresh()
{
    RECT Rc1,Rc2;
    GetWindowRect(theHwnd, &Rc1);
    Rc1.right = Rc1.left + scnW;
    Rc1.bottom = Rc1.top + scnH;

    Rc2.left = 0;
    Rc2.top = 0;
    Rc2.right = scnW;
    Rc2.bottom =scnH;

    HRESULT hr1 = DPrim1->Blt( &Rc1,DBack1,&Rc2,DDBLT_WAITNOTBUSY,NULL);
    return (hr1==DD_OK);
}

bool CDXGraphics::Draw(int x,int y,int w,int h,int resId,int srcX,int srcY,bool useColorKey)
{
    RECT rc1,rc2;
    rc1.left = x;
    rc1.top  = y;
    rc1.right= rc1.left + w;
    rc1.bottom=rc1.top + h;

    rc2.left = srcX;
    rc2.top  = srcY;
    rc2.right= rc2.left + w;
    rc2.bottom=rc2.top + h;

    DWORD flag1 = DDBLT_WAITNOTBUSY ;
    if(useColorKey)
    {
        flag1 |= DDBLT_KEYSRC;
    }

    HRESULT hr1 = this->DBack1->Blt(&rc1,this->vDRes1[resId],&rc2,flag1,NULL);
    return (hr1==DD_OK);
}

bool CDXGraphics::DrawRect(int x1, int y1, int w1, int h1, DWORD color1)
{
    RECT rc1;
    rc1.left = x1;
    rc1.top = y1;
    rc1.right = rc1.left + w1;
    rc1.bottom = rc1.top + h1;

    DDPIXELFORMAT ddpf;

    if (FAILED(DBack1->GetPixelFormat(&ddpf)))
    {
        return 1;
    }
    ::DDBLTFX bfx1;
    StructInit(bfx1);
    bfx1.dwFillColor = color1;


    HRESULT hr1 = DBack1->Blt( &rc1,NULL,NULL,DDBLT_COLORFILL ,&bfx1 );

    return (hr1==DD_OK);
}




int CDXGraphics::LoadRes(LPCTSTR FileName,DWORD colorKey )
{
    int id1 = vDRes1.size();
    
    LPDIRECTDRAWSURFACE lpDD;
    HBITMAP hbmp;

    hbmp = LoadBitmap(theApp.m_hInstance,FileName);
    if(hbmp == NULL)
    {
        return -1;
    }

    HRESULT hr1 = CreateDDSurfaceFromBitmap(this->DDraw1,lpDD,hbmp,0,0,0,0);
    if( hr1 != DD_OK)
    {
        return -1;
    }

    if(colorKey!=0xffffffff)
    {
        DDCOLORKEY cKey;
        cKey.dwColorSpaceHighValue = colorKey;
        cKey.dwColorSpaceLowValue  = colorKey;
        hr1 = lpDD->SetColorKey(0,&cKey);
        if(hr1 != DD_OK){return -1;}
    }

    this->vDRes1.push_back(lpDD);

    DeleteObject(hbmp);

    return id1;
}



java 代码:
//个人某自娱自乐作品截取

/**
* 此类用于描述一个Boss的动作,起到控制boss的作用
*/
public abstract class BossAction1 extends TimeLine1
{
    /**是哪个boss的动作*/
    protected Boss1 boss1;
    
    protected static final int cMaxKey=10; //默认的时间轴最大key数量
    
    public Boss1 GetBoss1(){return boss1;}
    public void SetBoss1(Boss1 val1){boss1=val1;}
    
    /**
     * 构造函数
     * @param TimeInc1 时间轴的增量,参见TimeLine1的构造函数
     * @param MaxKeyCount1 最大TimeKey数量,参见TimeLine1的构造函数
     */
    public BossAction1(int TimeInc1,int maxKeyCount)
    {
        super(TimeInc1,maxKeyCount);
        boss1=null;
        sTimeInc1=TimeInc1;
        sTime1=0;
    }
    
    /**
     * 构造函数,使用默认的TimeKey数量
     * @param TimeInc1 时间轴的增量,参见TimeLine1的构造函数
     */
    public BossAction1(int TimeInc1)
    {
        this(TimeInc1,cMaxKey);
    }
    
    /**
     * 构造函数
     * @param theBoss1 描述哪个boss的动作
     * @param TimeInc1 时间轴的增量,参见TimeLine1的构造函数
     * @param MaxKeyCount1 最大TimeKey数量,参见TimeLine1的构造函数
     */
    public BossAction1(Boss1 theBoss1,int TimeInc1,int maxKeyCount)
    {
        this(TimeInc1,maxKeyCount);
        boss1=theBoss1;
    }
    
    /**
     * boss动作的驱动函数,会先调用go()驱动时间轴,然后引发doAction1()
     * @return doAction1()的返回值
     */
    public final int Action1()
    {
        this.Go();
        int bk1=doAction1();
        return bk1;
    }
    
    /**
     * boss的动作控制函数,默认什么都不做。
     * 重载此函数可以提供对boss的实时控制。(以配合时间轴所提供的非实时控制,如Handle1()等)
     * @return 可自定义返回值,默认返回0。
     */
    protected int doAction1(){return 0;};
    
    /**
     * 当前Action的名字
     * @return 名字
     */
    abstract public String GetActionName1();
    
    /**
     * 获得动作剩余的时间
     * @return 时间(毫秒为单位)
     */
    abstract public int GetLastTime1();
    
}



vb 代码:
'很久之前写的2D游戏用VB图像绘制模块截取
Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long

Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

'==========================================================================================

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Declare Function timeGetTime Lib "winmm.dll" () As Long


Public ResPic1() As StdPicture
Public ResPicDC1() As Long
Public ResPicRect1() As Rect
Public ResPicCount1 As Long

Public TargetSurf1 As PictureBox

Function InitGDI1(NewTargetSurf1 As PictureBox, Optional ByVal sWidth1 As Long = -5, Optional sHeight1 As Long = -5)
Set TargetSurf1 = NewTargetSurf1
TargetSurf1.AutoRedraw = True
TargetSurf1.Parent.ScaleMode = 3
TargetSurf1.ScaleMode = 3
If sWidth1 > 0 Then TargetSurf1.Width = sWidth1
If sHeight1 > 0 Then TargetSurf1.Height = sHeight1
End Function

Function InitGDI_Res1(ByVal Count1 As Long)
ResPicCount1 = 5
ReDim ResPic1(ResPicCount1)
ReDim ResPicDC1(ResPicCount1)
ReDim ResPicRect1(ResPicCount1)

End Function


Function LoadBitmap1(ByVal Idx1 As Long, File1 As String)
Set ResPic1(Idx1) = LoadPicture(File1)
ResPicDC1(Idx1) = CreateCompatibleDC(ByVal 0&)
SelectObject ResPicDC1(Idx1), ResPic1(Idx1).Handle
With ResPicRect1(Idx1)
  .Left = 0
  .Top = 0
  .Right = TargetSurf1.ScaleX(ResPic1(Idx1).Width, vbHimetric, vbPixels)
  .Bottom = TargetSurf1.ScaleY(ResPic1(Idx1).Height, vbHimetric, vbPixels)
End With

End Function
Function CopyBitmap1(ByVal Idx1 As Long, Pic1 As Picture)
Set ResPic1(Idx1) = Pic1
ResPicDC1(Idx1) = CreateCompatibleDC(ByVal 0&)
SelectObject ResPicDC1(Idx1), ResPic1(Idx1).Handle
With ResPicRect1(Idx1)
  .Left = 0
  .Top = 0
  .Right = TargetSurf1.ScaleX(ResPic1(Idx1).Width, vbHimetric, vbPixels)
  .Bottom = TargetSurf1.ScaleY(ResPic1(Idx1).Height, vbHimetric, vbPixels)
End With

End Function

Function GDI_Draw1(ByVal x1 As Long, ByVal y1 As Long, ByVal ResIdx1 As Long, SrcRc1 As Rect, Optional dwRop1 As Long = vbSrcCopy) as Long
Dim back1 As Long
back1 = BitBlt(TargetSurf1.hdc, x1, y1, SrcRc1.Right - SrcRc1.Left, SrcRc1.Bottom - SrcRc1.Top, _
             ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, dwRop1)
            
If back1 = 0 Then GDI_Draw1=1

End Function



看来虽然还有点小问题,但是正常使用已经完全可以了。就这样吧,很晚了,睡。


[本日志由 sandy1 于 2009-10-21 11:40 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
评论: 0 | 引用: 0 | 查看次数: 233
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭